Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Почему я умнее оптимизатора скуля? (число прочтений - 2118 )
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Почему я умнее оптимизатора скуля?
25. Февраля 2011 :: 07:51
Печать  
Итак, запрос:

Код
Выбрать все
Select
...
From
(
select
...
From
рег.Итоги

Union All

select
...,
			CASE
				WHEN рег.Date_Time_IDDOC < @ПозицияДокумента Then (1-2*рег.DebKred)*рег.sp4008
				ELSE 0
			END Сумма,
			CASE
				WHEN рег.Date_Time_IDDOC < @ПозицияДокумента Then (1-2*рег.DebKred)*рег.sp4007
				ELSE 0
			END Количество,
			CASE
				WHEN рег.Date_Time_IDDOC < @ПозицияДокумента Then (1-2*рег.DebKred)*рег.sp54155
				ELSE 0
			END Вес,
			(1-2*рег.DebKred)*рег.sp4008 КонСумма,
			(1-2*рег.DebKred)*рег.sp4007 КонКоличество,
			(1-2*рег.DebKred)*рег.sp54155 КонВес
		FROM
			ra4001 рег (Nolock, Index(DATETIME))
		WHERE
			рег.Date_Time_IDDOC >= @НачДвиженийДляИтогов
			And рег.Date_Time_IDDOC < @КонДата

	) рег
WHERE
	рег.МестоХранения in ( '     7   ', '    28   ')
And рег.МПЗ in (SELECT ID FROM [#0cc38874-c113-4f79-9e95-3a669cf46d87] (NoLock))
GROUP BY
...
 



Внимание, фигня: если я убераю выделенный тэйблхинт (оставляю только нолок) - скуль из индекс сеек сваливается в кластеред индекс скан. С соответствующим изменением времени выполнения запроса (добавление хинта по индексу сократило выполнение такого запроса с 10..17 секунд до <1 секунды - в зависимости от фильтров).

Что меня особо смущает - это игнорирование оптимизатором условий, четко попадающих в правильный индекс и дающих хорошую селективность.
  
Наверх
 
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Почему я умнее оптимизатора скуля?
Ответ #1 - 25. Февраля 2011 :: 08:25
Печать  
как видимо фрагментированность индексов и не обновленная статистика.
  
Наверх
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Почему я умнее оптимизатора скуля?
Ответ #2 - 25. Февраля 2011 :: 08:54
Печать  
(0) какой план запросов смотрел планируемый или фактический ?
при планируемом плане запросов sql не знает значений переменных и не может их применить ( легко проверить в mag studio поставь вместо переменных константы и посмотри план. Также есть опция в sql2005
( как называется не помню ) которая выставляет переменные в те значения при которых будет компилироваться план запроса.

  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Почему я умнее оптимизатора скуля?
Ответ #3 - 25. Февраля 2011 :: 10:01
Печать  
leshik писал(а) 25. Февраля 2011 :: 08:25:
как видимо фрагментированность индексов и не обновленная статистика.

Ммм... индексы полностью перестраивал месяца 3-4 назад (до этого много лет их вообще никто не трогал). Не думаю, что за 4 месяца там случился хаос. Хотя уже задумывался над повторной реиндексацией.


Цитата:
какой план запросов смотрел планируемый или фактический ?

Фактический.
  
Наверх
 
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Почему я умнее оптимизатора скуля?
Ответ #4 - 25. Февраля 2011 :: 11:22
Печать  
Z1 очень верно написал.
Объявите в начале запроса
Declare @КонДата DateTime
Set @КонДата = ?
  
Наверх
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Почему я умнее оптимизатора скуля?
Ответ #5 - 25. Февраля 2011 :: 14:07
Печать  
leshik писал(а) 25. Февраля 2011 :: 11:22:
Z1 очень верно написал.
Объявите в начале запроса
Declare @КонДата DateTime
Set @КонДата = ?

так надо было делать для sql 2000
для sql2005 и выше  надо использовать OPTIMIZE FOR
смотрите ссылку http://msmvps.com/blogs/gladchenko/archive/2006/08/14/107592.aspx


тоже самое но сложнее описано
http://msdn.microsoft.com/ru-ru/library/ms190417(v=SQL.100).aspx

  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Почему я умнее оптимизатора скуля?
Ответ #6 - 26. Февраля 2011 :: 17:32
Печать  
В любом случае - курился фактический план запроса.

Примерно такой скрипт (заботливо упертый чуть ли даже не с этого форума)
Код
Выбрать все
	  IF @frag < 30.0
		SET @command = N'ALTER INDEX ' + @indexname + N' ON ' + @schemaname + N'.' + @objectname + N' REORGANIZE';
	  IF @frag >= 30.0
		SET @command = N'ALTER INDEX ' + @indexname + N' ON ' + @schemaname + N'.' + @objectname + N' REBUILD';
	  IF @partitioncount > 1
		SET @command = @command + N' PARTITION=' + CAST(@partitionnum AS nvarchar(10));
	  EXEC (@command);
	  PRINT N'Executed: ' + @command+N' процент фрагментации был: '+QUOTENAME(@frag);
 



Произвел дефраментацию индексов в паре справочников и таблице проводок.
  
Наверх
 
IP записан
 
Berck
Junior Member
**
Отсутствует



Сообщений: 66
Местоположение: Москва
Зарегистрирован: 17. Июля 2007
Пол: Мужской
Re: Почему я умнее оптимизатора скуля?
Ответ #7 - 28. Февраля 2011 :: 14:47
Печать  
А можно скрипт полностью?
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Почему я умнее оптимизатора скуля?
Ответ #8 - 01. Марта 2011 :: 06:22
Печать  
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать