Переключение на Главную Страницу Страницы: [1]  ОтправитьПечать
Очень популярная тема (более 25 ответов) План выполнения (число прочтений - 6843 )
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
План выполнения
30. Апреля 2008 :: 02:22
Печать  
Использую табличное поле,  запрос:

Код
Выбрать все
Declare @QParam__filter_2_9_0 numeric(9,0), @OKParam_0 varchar(99)
set @QParam__filter_2_9_0 = -10000000
set @OKParam_0 = 'Деликатесная в/к    84   '

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.ЗаказаноКоличество) - SUM(T.НабраноКоличество) as ОсталосьКоличество,
		SUM(T.ЗаказаноВес) - SUM(T.НабраноВес) as ОсталосьВес
	From dbo.GetTrafficByStatusByRequest(101) as T
	group by T.ИдНом


) as TBS  on TBS.ИдНом = N.id1s
where (N.KeySort > @OKParam_0)
order by N.KeySort

 



Всё хорошо выполняется порядко 80 мс, добавляю условие:
and  TBS.ОсталосьВес  > @QParam__filter_2_9_0

План выполнение изменяется до неузноваемости и время выполнение 400 мс Печаль,
что можно сделать?


  
Наверх
ICQ  
IP записан
 
ev-kov
God Member
*****
Отсутствует



Сообщений: 694
Зарегистрирован: 27. Декабря 2006
Пол: Мужской
Re: План выполнения
Ответ #1 - 30. Апреля 2008 :: 05:12
Печать  
план запроса не мешает бы, тот который за 80мс, и dds
  

Информация - то, что снижает неопределенность в какой-либо области и очень важно не ошибиться областью в наш информационный век!
Наверх
 
IP записан
 
sadovnikov
1c++ power user
Отсутствует


I Love YaBB 2!

Сообщений: 420
Зарегистрирован: 06. Марта 2007
Re: План выполнения
Ответ #2 - 30. Апреля 2008 :: 05:13
Печать  
ev-kov писал(а) 30. Апреля 2008 :: 05:12:
план запроса не мешает бы, тот который за 80мс


А зачем он тебе? Посмотри, что есть TBS.ОсталосьВес и погрусти вместе со скулем.
  
Наверх
 
IP записан
 
ev-kov
God Member
*****
Отсутствует



Сообщений: 694
Зарегистрирован: 27. Декабря 2006
Пол: Мужской
Re: План выполнения
Ответ #3 - 30. Апреля 2008 :: 05:17
Печать  
sadovnikov писал(а) 30. Апреля 2008 :: 05:13:
ev-kov писал(а) 30. Апреля 2008 :: 05:12:
план запроса не мешает бы, тот который за 80мс


А зачем он тебе? Посмотри, что есть TBS.ОсталосьВес и погрусти вместе со скулем.

хинты выставить самому вручную, с учетом имеющихся индексов

ЗЫ: я правильно понимаю скуль игнорировать хинты не может, он должен следовать им?
  

Информация - то, что снижает неопределенность в какой-либо области и очень важно не ошибиться областью в наш информационный век!
Наверх
 
IP записан
 
sadovnikov
1c++ power user
Отсутствует


I Love YaBB 2!

Сообщений: 420
Зарегистрирован: 06. Марта 2007
Re: План выполнения
Ответ #4 - 30. Апреля 2008 :: 05:19
Печать  
ev-kov писал(а) 30. Апреля 2008 :: 05:17:
хинты выставить самому вручную, с учетом имеющихся индексов


И какой индекс ты планируешь задействовать для:

SUM(T.ЗаказаноВес) - SUM(T.НабраноВес)

?
  
Наверх
 
IP записан
 
ev-kov
God Member
*****
Отсутствует



Сообщений: 694
Зарегистрирован: 27. Декабря 2006
Пол: Мужской
Re: План выполнения
Ответ #5 - 30. Апреля 2008 :: 05:25
Печать  
а если заменить

Код
Выбрать все
   select
	T.ИдНом,
		SUM(T.НабраноВес) as НабраноВес,
		SUM(T.НабраноКоличество) as НабраноКоличество,
		SUM(T.ЗаказаноВес) as ЗаказаноВес,
		SUM(T.ЗаказаноКоличество) as ЗаказаноКоличество,
		SUM(T.ЗаказаноКоличество) - SUM(T.НабраноКоличество) as ОсталосьКоличество,
		SUM(T.ЗаказаноВес) - SUM(T.НабраноВес) as ОсталосьВес
	From dbo.GetTrafficByStatusByRequest(101) as T
	group by T.ИдНом
 



на
Код
Выбрать все
 
          select
		TT.НабраноВес as НабраноВес,
		TT.НабраноКоличество as НабраноКоличество,
		TT.ЗаказаноВес as ЗаказаноВес,
		TT.ЗаказаноКоличество as ЗаказаноКоличество,
		TT.ОсталосьКоличество as ОсталосьКоличество,
		TT.ОсталосьВес as ОсталосьВес
           FROM (
            select
	T.ИдНом,
		SUM(T.НабраноВес) as НабраноВес,
		SUM(T.НабраноКоличество) as НабраноКоличество,
		SUM(T.ЗаказаноВес) as ЗаказаноВес,
		SUM(T.ЗаказаноКоличество) as ЗаказаноКоличество,
		SUM(T.ЗаказаноКоличество) - SUM(T.НабраноКоличество) as ОсталосьКоличество,
		SUM(T.ЗаказаноВес) - SUM(T.НабраноВес) as ОсталосьВес
	From dbo.GetTrafficByStatusByRequest(101) as T
	group by T.ИдНом ) as TT

 

  

Информация - то, что снижает неопределенность в какой-либо области и очень важно не ошибиться областью в наш информационный век!
Наверх
 
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: План выполнения
Ответ #6 - 30. Апреля 2008 :: 05:25
Печать  
sadovnikov писал(а) 30. Апреля 2008 :: 05:19:
ev-kov писал(а) 30. Апреля 2008 :: 05:17:
хинты выставить самому вручную, с учетом имеющихся индексов


И какой индекс ты планируешь задействовать для:

SUM(T.ЗаказаноВес) - SUM(T.НабраноВес)

?


Да тут врядли удастся что -нибудь сделать, разве что Indexed View прикрутить попробывать
  
Наверх
ICQ  
IP записан
 
ev-kov
God Member
*****
Отсутствует



Сообщений: 694
Зарегистрирован: 27. Декабря 2006
Пол: Мужской
Re: План выполнения
Ответ #7 - 30. Апреля 2008 :: 05:26
Печать  
sadovnikov писал(а) 30. Апреля 2008 :: 05:19:
ev-kov писал(а) 30. Апреля 2008 :: 05:17:
хинты выставить самому вручную, с учетом имеющихся индексов


И какой индекс ты планируешь задействовать для:

SUM(T.ЗаказаноВес) - SUM(T.НабраноВес)

?

для него конечно индекса нет, планировал вручную указать оптимизатору какие использвать, а другие не использовать
  

Информация - то, что снижает неопределенность в какой-либо области и очень важно не ошибиться областью в наш информационный век!
Наверх
 
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: План выполнения
Ответ #8 - 30. Апреля 2008 :: 05:32
Печать  
ev-kov писал(а) 30. Апреля 2008 :: 05:12:
план запроса не мешает бы, тот который за 80мс, и dds

А план запроса можно как- нибудь сохранить кроме как PrintScreen?
  
Наверх
ICQ  
IP записан
 
ev-kov
God Member
*****
Отсутствует



Сообщений: 694
Зарегистрирован: 27. Декабря 2006
Пол: Мужской
Re: План выполнения
Ответ #9 - 30. Апреля 2008 :: 05:37
Печать  
Nick писал(а) 30. Апреля 2008 :: 05:32:
ev-kov писал(а) 30. Апреля 2008 :: 05:12:
план запроса не мешает бы, тот который за 80мс, и dds

А план запроса можно как- нибудь сохранить кроме как PrintScreen?

1CQA умеет сам строить планы - текстовые Улыбка
  

Информация - то, что снижает неопределенность в какой-либо области и очень важно не ошибиться областью в наш информационный век!
Наверх
 
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: План выполнения
Ответ #10 - 30. Апреля 2008 :: 05:39
Печать  
ev-kov писал(а) 30. Апреля 2008 :: 05:37:
Nick писал(а) 30. Апреля 2008 :: 05:32:
ev-kov писал(а) 30. Апреля 2008 :: 05:12:
план запроса не мешает бы, тот который за 80мс, и dds

А план запроса можно как- нибудь сохранить кроме как PrintScreen?

1CQA умеет сам строить планы - текстовые Улыбка

Ага, только соединение у меня ни через 1с, это нужно 1CQA переписывать
  
Наверх
ICQ  
IP записан
 
spock
1c++ developer
1c++ moderator
Отсутствует



Сообщений: 822
Местоположение: Новосибирск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: План выполнения
Ответ #11 - 30. Апреля 2008 :: 06:35
Печать  
Nick писал(а) 30. Апреля 2008 :: 05:32:
А план запроса можно как- нибудь сохранить кроме как PrintScreen?

Например, так:
QA-Tools-Options-Coonection properties-Set showplan_text

Или так:
Код
Выбрать все
SET SHOWPLAN_TEXT ON
GO

...

SET SHOWPLAN_TEXT OFF
GO
 

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



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: План выполнения
Ответ #12 - 30. Апреля 2008 :: 06:44
Печать  
spock писал(а) 30. Апреля 2008 :: 06:35:
Nick писал(а) 30. Апреля 2008 :: 05:32:
А план запроса можно как- нибудь сохранить кроме как PrintScreen?

Например, так:
QA-Tools-Options-Coonection properties-Set showplan_text

Или так:
Код
Выбрать все
SET SHOWPLAN_TEXT ON
GO

...

SET SHOWPLAN_TEXT OFF
GO
 



Спасибо, вот планы выполнения кому интересно
  

Plan.rar ( 1 KB | Загрузки )
Наверх
ICQ  
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: План выполнения
Ответ #13 - 30. Апреля 2008 :: 07:30
Печать  
Nick писал(а) 30. Апреля 2008 :: 02:22:
Использую табличное поле

Второй план не попадает в индекс по ключу порядка. Если не ошибаюсь (ТП не пользую), для ТП это критично. Возможно, стоит просто задать ключ порядка из двух полей (descr, id1s).
  

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



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: План выполнения
Ответ #14 - 30. Апреля 2008 :: 07:48
Печать  
berezdetsky писал(а) 30. Апреля 2008 :: 07:30:
Nick писал(а) 30. Апреля 2008 :: 02:22:
Использую табличное поле

Второй план не попадает в индекс по ключу порядка. Если не ошибаюсь (ТП не пользую), для ТП это критично. Возможно, стоит просто задать ключ порядка из двух полей (descr, id1s).


Вообще то ключ порядка это: N.KeySort  = rtrim(descr) + id1s- это вычисляемый столбец, и индекс по нему есть
  
Наверх
ICQ  
IP записан
 
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] 
ОтправитьПечать