Переключение на Главную Страницу Страницы: 1 [2]  ОтправитьПечать
Очень популярная тема (более 25 ответов) План выполнения (число прочтений - 6694 )
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: План выполнения
Ответ #15 - 30. Апреля 2008 :: 07:56
Печать  
Nick писал(а) 30. Апреля 2008 :: 07:48:
Вообще то ключ порядка это: N.KeySort  = rtrim(descr) + id1s- это вычисляемый столбец, и индекс по нему есть

Я заметил это в плане выполения Подмигивание . Но такой индекс бесполезен для соединения с подзапросом - по-этому вместо него там используется PK_Nomenclature с последующим перебором всей таблицы в Sort.
Впрочем, если в N не много записей, большой разницы не будет.
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: План выполнения
Ответ #16 - 30. Апреля 2008 :: 08:03
Печать  
Цитата:
Впрочем, если в N не много записей, большой разницы не будет.


В N порядка 500 записей
  
Наверх
ICQ  
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: План выполнения
Ответ #17 - 30. Апреля 2008 :: 08:06
Печать  
Цитата:
Но такой индекс бесполезен для соединения с подзапросом

Почему бесполезен? В первом случае (без доп условия) он в него попадает
  
Наверх
ICQ  
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: План выполнения
Ответ #18 - 30. Апреля 2008 :: 08:39
Печать  
Nick писал(а) 30. Апреля 2008 :: 08:06:
Почему бесполезен? В первом случае (без доп условия) он в него попадает

В первом случае это не накладно, т.к. в left outer join таблица N стоит слева (обрабатывается первой). А когда ты добавляешь условие по полю подзапроса в секцию where, соединение становится внутренним и порядок соединения таблиц меняется.

О перемене мест слагаемых:
SUM(T.ЗаказаноКоличество) - SUM(T.НабраноКоличество)
не равно
SUM(T.ЗаказаноКоличество - T.НабраноКоличество)
?
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: План выполнения
Ответ #19 - 30. Апреля 2008 :: 08:51
Печать  
Цитата:
О перемене мест слагаемых:
SUM(T.ЗаказаноКоличество) - SUM(T.НабраноКоличество)
не равно
SUM(T.ЗаказаноКоличество - T.НабраноКоличество)
?


Это да, это я гоню уже...
  
Наверх
ICQ  
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: План выполнения
Ответ #20 - 30. Апреля 2008 :: 08:54
Печать  
Цитата:
SUM(T.ЗаказаноКоличество - T.НабраноКоличество)

Так запрос работает быстрее где-то на 0.5 % Улыбка
  
Наверх
ICQ  
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: План выполнения
Ответ #21 - 30. Апреля 2008 :: 09:03
Печать  
berezdetsky писал(а) 30. Апреля 2008 :: 08:39:
А когда ты добавляешь условие по полю подзапроса в секцию where, соединение становится внутренним

А про это что скажешь? Если перенести добавляемое условие в секцию FROM запроса или HAVING подзапроса, соединение останется внешним..
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: План выполнения
Ответ #22 - 30. Апреля 2008 :: 09:15
Печать  
berezdetsky писал(а) 30. Апреля 2008 :: 09:03:
berezdetsky писал(а) 30. Апреля 2008 :: 08:39:
А когда ты добавляешь условие по полю подзапроса в секцию where, соединение становится внутренним

А про это что скажешь? Если перенести добавляемое условие в секцию FROM запроса или HAVING подзапроса, соединение останется внешним..


Имеешь в виду вот так:

Код
Выбрать все
select top 20
	N.KeySort as КлючПорядка,
	N.id1s as ИД,
	N.PLU as PLU,
	N.Descr as Наименование,
	N.Unit as ЕдИзм,
	N.isUnit as Штучная,
	isNULL(CASE
				WHEN N.isUnit = 1 THEN  TBS.ОсталосьКоличество
				ELSE  TBS.ОсталосьВес
			END,0 ) as ОсталосьИтого
from Nomenclature as N (nolock )
left join
(
	Select
		T.ИдНом,
		SUM(T.НабраноВес) as НабраноВес,
		SUM(T.НабраноКоличество) as НабраноКоличество,
		SUM(T.ЗаказаноВес) as ЗаказаноВес,
		SUM(T.ЗаказаноКоличество) as ЗаказаноКоличество,
		SUM(T.ЗаказаноКоличество - T.НабраноКоличество) as ОсталосьКоличество,
		SUM(T.ЗаказаноВес - T.НабраноВес) as ОсталосьВес
	From dbo.GetTrafficByStatusByRequest(101) as T
	group by T.ИдНом
	having SUM(T.ЗаказаноВес - T.НабраноВес) >0
) as TBS  on TBS.ИдНом = N.id1s
where (N.KeySort > @OKParam_0)
--and  TBS.ОсталосьВес  > @QParam__filter_2_9_0
order by N.KeySort

 



Так он отрабатывает по первому плану выполнения, но в итоговую выборку попадут ненужные записи Печаль
  
Наверх
ICQ  
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: План выполнения
Ответ #23 - 30. Апреля 2008 :: 09:22
Печать  
Nick писал(а) 30. Апреля 2008 :: 09:15:
Так он отрабатывает по первому плану выполнения, но в итоговый запрос поподут ненужные записи Печаль

Ну извини, глядя на isNULL и left join, так сразу и не скажешь, что они не нужны..  Подмигивание
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: План выполнения
Ответ #24 - 30. Апреля 2008 :: 09:24
Печать  
Цитата:
Ну извини, глядя на isNULL и left join, так сразу и не скажешь, что они не нужны.. 

Ну вообще да  Улыбка. Просто я этим параметром хотел рулить фильтром - типа вся номенклатура или только заказанная
  
Наверх
ICQ  
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: План выполнения
Ответ #25 - 30. Апреля 2008 :: 09:31
Печать  
Nick писал(а) 30. Апреля 2008 :: 09:15:
Код
Выбрать все
		SUM(T.НабраноВес) as НабраноВес,
		SUM(T.НабраноКоличество) as НабраноКоличество,
		SUM(T.ЗаказаноВес) as ЗаказаноВес,
		SUM(T.ЗаказаноКоличество) as ЗаказаноКоличество,
		SUM(T.ЗаказаноКоличество - T.НабраноКоличество) as ОсталосьКоличество,
		SUM(T.ЗаказаноВес - T.НабраноВес) as ОсталосьВес 


О_о
Я, когда писал SUM(T.ЗаказаноКоличество - T.НабраноКоличество), подразумевал, что первые четыре агрегата будут убраны - чтобы оставить два суммирования вместо четырёх..
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: План выполнения
Ответ #26 - 30. Апреля 2008 :: 09:37
Печать  
Результат тот же видимо SQL сам отбрасывает поля не попадающие в результирующий запрос
  
Наверх
ICQ  
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: План выполнения
Ответ #27 - 04. Мая 2008 :: 06:01
Печать  
to berezdetsky: В общем всё оказалось очень загадочно - у меня в таблице тары есть поле isMark as bit
я в запорсе писал isMark <> 0,

а теперь добавил второй параметрр в функцию

dbo.GetTrafficByStatusByRequest(@Status as smallint,  @isMark  as bit = 0      )  

И всё залетало! Время выполнения 80мс. Вот такие вот пироги Улыбка.

Спасибо за участие
« Последняя редакция: 04. Мая 2008 :: 07:09 - Nick »  
Наверх
ICQ  
IP записан
 
Переключение на Главную Страницу Страницы: 1 [2] 
ОтправитьПечать