Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 SQL запрос - оптимизация  [new]
Galadriel75
Member

Откуда:
Сообщений: 1324
Доброе время суток!!!

Вот кто может подсказать есть ли какие инструменты чтоб сравнить какой запрос выполняется лучше и быстрее
и можно ли как-нибудь в каком-нить ракурсе заюзать для этого explain? (тока догадываюсь очень отдаленно для чего он - с ним еще не работал)
Очень критична скорость выполнения так как данных все больше и надо уже более тонко оптимизировать запросы, так как их много и куча подзапросов и временных таблиц... Вот например - крохотный кусочек из гигантской свалки:
select *,
k=CASE WHEN rnk=2 then CASE WHEN exists
    (
    Select Distinct Max(dat) AS Dat,Mod,Ku from NSI.dbo.SprModUh  GROUP BY Mod,Ku HAVING Ku <> 203 
        and Max(dat)>a.Dat And Mod in (Select Distinct ModId From #DataMod)
     )
         then 'A' ELSE 'B' END END
from
(
select Dat,Mod,Ku,ROW_NUMBER() OVER(PARTITION BY Mod ORDER BY Mod) AS rnk from
(
Select Distinct Max(dat) AS Dat,Mod,Ku from NSI.dbo.SprModUh
Where Mod in (Select Distinct ModId From #DataMod)
Group by Mod,Ku
) as aa
) As a
where Ku=203
order by Mod,Ku


тут есть подзапросы, может лучше табличные переменные заюзать или CTE или врем. таблицы - вопрос - есть ли какой инструмент, который позволит ну очень тонко почувствовать какой запрос наиболее оптимальный ???
Если такого хлама будет накапливаться, то их (кучу запросов) как то надо будет увязать, чтоб работали слаженно и быстро ...
21 сен 12, 18:59    [13204477]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос - оптимизация  [new]
aleks2
Guest
1. Как эльфы то поглупели со времен Саурона.

2. Не расскажите, чего символизирует Distinct в
Select Distinct Max(dat) AS Dat,Mod,Ku from NSI.dbo.SprModUh
Where Mod in (Select Distinct ModId From #DataMod)
Group by Mod,Ku
21 сен 12, 19:07    [13204500]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос - оптимизация  [new]
Добрый Э - Эх
Guest
Galadriel75, зачем в самом внутреннем подзапросе выбирать все Ku, если в самом внешнем запросе отсекается только Ku = 203?
21 сен 12, 19:12    [13204511]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос - оптимизация  [new]
aleks2
Guest
И вовсе нету необходимости совать группировку куды ни попадя

exists
    (
    Select Distinct Max(dat) AS Dat,Mod,Ku from NSI.dbo.SprModUh  GROUP BY Mod,Ku HAVING Ku <> 203 
        and Max(dat)>a.Dat And Mod in (Select Distinct ModId From #DataMod)
     )

эквивалентен
exists( Select * from NSI.dbo.SprModUh  where Ku <> 203 and dat>a.Dat And Mod in (Select  ModId From #DataMod) )
21 сен 12, 19:13    [13204514]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос - оптимизация  [new]
Galadriel75
Member

Откуда:
Сообщений: 1324
aleks2
1. Как эльфы то поглупели со времен Саурона.

2. Не расскажите, чего символизирует Distinct в
Select Distinct Max(dat) AS Dat,Mod,Ku from NSI.dbo.SprModUh
Where Mod in (Select Distinct ModId From #DataMod)
Group by Mod,Ku


да вроде он тут лишний - пятница конец раб дня... я примерчик писал на автопилоте....
Max все урежет и вернет единственную строку - дистинкт надо грохнуть... :)
21 сен 12, 19:15    [13204519]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос - оптимизация  [new]
Galadriel75
Member

Откуда:
Сообщений: 1324
aleks2
И вовсе нету необходимости совать группировку куды ни попадя

exists
    (
    Select Distinct Max(dat) AS Dat,Mod,Ku from NSI.dbo.SprModUh  GROUP BY Mod,Ku HAVING Ku <> 203 
        and Max(dat)>a.Dat And Mod in (Select Distinct ModId From #DataMod)
     )

эквивалентен
exists( Select * from NSI.dbo.SprModUh  where Ku <> 203 and dat>a.Dat And Mod in (Select  ModId From #DataMod) )


ок я пересмотрю запрос! Но надо выбрать максимальную дату, а Max требует Group... я немного отойду и перепроверю свой ацкий опус :)
21 сен 12, 19:18    [13204522]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос - оптимизация  [new]
Galadriel75
Member

Откуда:
Сообщений: 1324
Добрый Э - Эх
Galadriel75, зачем в самом внутреннем подзапросе выбирать все Ku, если в самом внешнем запросе отсекается только Ku = 203?


надо выяснить - есть ли модель на заданном участке, и нету ли ее же на других участках (по максимальной дате) - если есть на других она же, то считать, что на данном участке ее УЖЕ нету, так как ее перевели на другой участок (таблица не чистится, поэтому дрейфующие модели по участкам надо вот так вот и ловить :) )
21 сен 12, 19:22    [13204532]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос - оптимизация  [new]
Galadriel75
Member

Откуда:
Сообщений: 1324
временно с форума слажу - надо домой с работы заехать :)
надеюсь вскорости снова влезть :)
21 сен 12, 19:25    [13204543]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос - оптимизация  [new]
RedMercury
Guest
Galadriel75
Доброе время суток!!!

Вот кто может подсказать есть ли какие инструменты чтоб сравнить какой запрос выполняется лучше и быстрее

План запроса и матчасть. Читайте как работают индексы, оптимизируются запросы.
Для MS SQL хоошо подходит выражение "Краткость-сестра таланта", не надо писать ничего лишнего, а когда научитесь оптимизировать, то переделывать запросы бушет проще.

В запросе бросается в глаза сразу "IN", который разбивается на "ИЛИ" - лучше использовать EXISTS.
Если групировки не нужны - тоже лучше не использовать - появляются сортировки.
22 сен 12, 11:32    [13205975]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос - оптимизация  [new]
Galadriel75
Member

Откуда:
Сообщений: 1324
RedMercury
Galadriel75
Доброе время суток!!!

Вот кто может подсказать есть ли какие инструменты чтоб сравнить какой запрос выполняется лучше и быстрее

План запроса и матчасть. Читайте как работают индексы, оптимизируются запросы.
Для MS SQL хоошо подходит выражение "Краткость-сестра таланта", не надо писать ничего лишнего, а когда научитесь оптимизировать, то переделывать запросы бушет проще.

В запросе бросается в глаза сразу "IN", который разбивается на "ИЛИ" - лучше использовать EXISTS.
Если групировки не нужны - тоже лучше не использовать - появляются сортировки.


Ок. Спасибо. По поводу матчасти - очень бы даже не помешало почитать - что придется и сделать, так как много чего делается наугад и через Ж...
24 сен 12, 09:34    [13210857]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос - оптимизация  [new]
Galadriel75
Member

Откуда:
Сообщений: 1324
Запрос тот оказался малорабочим в силу бредовой идеи.... просто сделал такой - он как минимум вроде бы работает
			if (Trim(DbComboBoxUch.Text) <> '') then
			begin
				mVariables['Ku'] := Trim(DbComboBoxUch.Text);
				if tQuery <> '' then tQuery := tQuery + ' AND ';
				tQuery := tQuery + mVariables.Stuff('--'+
					'[eol] 	ModId IN ('+
					'[eol]	  SELECT a.Mod FROM ('+
					'[eol] 		  SELECT MAX(dat) AS Dat,Mod,Ku FROM NSI.dbo.SprModUh'+
					'[eol]		  		WHERE Mod IN (SELECT DISTINCT ModId FROM #DataMod) AND Ku=[Ku]'+
					'[eol]				GROUP BY Mod,Ku'+
					'[eol]			) AS a'+ 
					'[eol]	  LEFT JOIN (SELECT MAX(dat) AS Dat,Mod,Ku AS Ku1 FROM NSI.dbo.SprModUh WHERE Ku<>[Ku] GROUP BY Mod,Ku) AS b ON a.Mod=b.Mod AND b.Dat > a.Dat'+ 
					'[eol]	  WHERE Ku1 IS NULL )'); 
			end;


Думал сделать параметрический запрос, но потом подумал мало ли нарвусь на какую-нить фигню.... параметрический оставлю на потом... а сейчас - хоть через Ж но побыстрому...
24 сен 12, 13:43    [13212702]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос - оптимизация  [new]
Galadriel75
Member

Откуда:
Сообщений: 1324
Добрый вечер... Вот и подвернулась мне софтина, про которую я тут интересовался - если кому интересно - dbForge Studio for SQL Server. Эта программ может быть также и для других серваков... Версия для СНГ бесплатная... Пока еще ее не тестил, толком, но на вскидку - первое впечатление очень даже неплохое... Живет эта прога где-то на Devart... в общем в гугле ее легко найти на официальном сайте...
22 окт 12, 17:48    [13358097]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить