Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.07.2019, 13:46   #1
nactyx
Форумчанин
 
Регистрация: 11.10.2010
Сообщений: 152
По умолчанию Оптимизация запроса

Всем доброго времени суток, коллеги!

В ходе будничной рутины я наткнулся на один "костыль", который у нас много где используется. И, смотря на него, я почему-то уверен, что его можно написать короче, оптимизировать что ли. Но не могу додумать как. Может кто-то сможет помочь/подсказать, буду очень признателен.

Код:
SELECT 
	TOP 1 
	UPPER(SUBSTRING(card.NAME_I, 1, 1)) + '.' + UPPER(SUBSTRING(card.NAME_O, 1, 1)) + '.' + UPPER(SUBSTRING(card.NAME, 1, 1)) + LOWER(SUBSTRING(card.NAME, 2, LEN(card.NAME))),
	(CASE WHEN id_chief_type in (1, 2, 9, 22, 30, 38, 39, 40, 44, 83, 110, 123, 126, 142, 163, 164, 177, 189, 207, 224) 
		THEN 
			(CASE WHEN ISNULL(prtb_chief.dop_inf, '') <> '' THEN (SELECT '(по '+ ISNULL(prtb_chief.dop_inf, '') + ')') END) 
		END)
FROM 
	prtb_chief  
	LEFT JOIN Card ON Card.auto_card = prtb_chief.auto_card
WHERE 
	card.auto_card = 476492
	and id_firm = 17
	AND id_chief_type in (1, 2, 9, 22, 30, 38, 39, 40, 44, 83, 110, 123, 126, 142, 163, 164, 177, 189, 207, 224)
	and dop_inf != '';
"Смущает" секция CASE. Ну может еще что можно реализовать получше.

Заранее благодарю всех и желаю отличной пятницы и хороших выходных!
nactyx вне форума Ответить с цитированием
Старый 26.07.2019, 14:03   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А зачем в 1-м case полностью дублируется условие из where? Во 2-ом зачем-то select
Код:
SELECT 
	TOP 1 
	UPPER(SUBSTRING(card.NAME_I, 1, 1)) + '.' + UPPER(SUBSTRING(card.NAME_O, 1, 1)) + '.' + UPPER(SUBSTRING(card.NAME, 1, 1)) + LOWER(SUBSTRING(card.NAME, 2, LEN(card.NAME))),
	CASE WHEN ISNULL(prtb_chief.dop_inf, '') <> '' THEN '(по '+ prtb_chief.dop_inf + ')' ELSE NULL END 
FROM 
	prtb_chief  
	LEFT JOIN Card ON Card.auto_card = prtb_chief.auto_card
WHERE 
	card.auto_card = 476492
	and id_firm = 17
	AND id_chief_type in (1, 2, 9, 22, 30, 38, 39, 40, 44, 83, 110, 123, 126, 142, 163, 164, 177, 189, 207, 224)
	and dop_inf != '';
Можно вообще dop_inf передать клиенту и пусть он вычисляемое поле сделает. Самое узкое место:
Код:
AND id_chief_type in (1, 2, 9, 22, 30, 38, 39, 40, 44, 83, 110, 123, 126, 142, 163, 164, 177, 189, 207, 224)
Считай что это равносильно тому, что запрос выполнится столько раз, сколько там констант. Ну почти) Занести их в отдельную табличку, прицепить её к запросу - на порядок эффективнее

Ну и, скорее всего, исходя из card.auto_card = 476492 там не left join, а inner join лучше будет
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 26.07.2019 в 14:10.
Аватар вне форума Ответить с цитированием
Старый 26.07.2019, 23:37   #3
nactyx
Форумчанин
 
Регистрация: 11.10.2010
Сообщений: 152
По умолчанию

Аватар, спасибо! Насчёт констант - подобные вещи следствие больших проблем) За которые никто не хочет браться и на которые закрывают глаза. Структурных проблем, если можно так выразиться.

А вот с иннер джоин хотелось бы подробнее, если возможно, именно на этом примере. Всегда была проблема с различием, как не научили нормально - так что-то только «лэфтом» и пользуюсь.
nactyx вне форума Ответить с цитированием
Старый 26.07.2019, 23:39   #4
nactyx
Форумчанин
 
Регистрация: 11.10.2010
Сообщений: 152
По умолчанию

Да и по доп_инф будто бы case не нужен. Там ведь в секции where то же неравенство. Или я не прав? Извиняюсь за корявость, с телефона пишу.

Хотя нет, там же изнулл.

Последний раз редактировалось nactyx; 27.07.2019 в 00:18.
nactyx вне форума Ответить с цитированием
Старый 08.08.2019, 10:56   #5
nactyx
Форумчанин
 
Регистрация: 11.10.2010
Сообщений: 152
По умолчанию

Можно закрыть, спасибо Аватару.
nactyx вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Оптимизация SQL запроса PTyTb32 SQL, базы данных 8 07.03.2019 10:54
Оптимизация запроса Spyhunter1983 SQL, базы данных 2 05.10.2011 15:24
оптимизация запроса pray_driver SQL, базы данных 3 13.12.2010 15:40
Оптимизация запроса za4ot SQL, базы данных 0 11.06.2010 09:24
Оптимизация SQL запроса Phantom SQL, базы данных 4 24.09.2009 16:07