Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) Можно ли ускорить время выполнения запроса??? (число прочтений - 2889 )
Bagirius
Full Member
***
Отсутствует



Сообщений: 135
Зарегистрирован: 19. Февраля 2008
Пол: Мужской
Можно ли ускорить время выполнения запроса???
26. Января 2010 :: 09:15
Печать  
Можно ли ускорить время выполнения запроса???
Может не совсем оптимально написано?

Код
Выбрать все
SELECT ПартииТоваровОстатки.Товар [Товар $Справочник.Номенклатура]
	, ПартииТоваровОстатки.Партия [Партия $Документ]
,ПартииТоваровОстатки.Склад [Склад $Справочник.МестаХранения]
	, ПартииТоваровОстатки.КонтрагентПартии [КонтрагентПартии $Справочник.Контрагенты]
	, ПартииТоваровОстатки.Перевертыш
	, Sum(ПартииТоваровОстатки.ОстатокТовараОстаток) КонОст
	, Sum(РезервыТоваровОстатки.РезервТовараОстаток) КонРез
	, Sum(ПартииТоваровОстатки.СебестоимостьОстаток) КонСеб
	, Sum(ПартииТоваровОстатки.ВалютнаяСебестоимостьОстаток) КонВСеб
FROM $РегистрОстатки.ПартииТоваров(:ВыбДата~,,(Товар IN (SELECT val FROM #ВыбТовары))
		AND (Фирма = :ВыбФирма),
		(Товар, Партия, Перевертыш, Склад, КонтрагентПартии),) AS ПартииТоваровОстатки
	LEFT OUTER JOIN $РегистрОстатки.РезервыТоваров(:ВыбДата~,,(Товар IN (SELECT val FROM #ВыбТовары))
		AND (Фирма = :ВыбФирма),
		(Товар, Партия, Склад, Перевертыш),) AS РезервыТоваровОстатки
	ON ПартииТоваровОстатки.Товар = РезервыТоваровОстатки.Товар
	AND ПартииТоваровОстатки.Партия = РезервыТоваровОстатки.Партия
	AND ПартииТоваровОстатки.Перевертыш = РезервыТоваровОстатки.Перевертыш
	AND ПартииТоваровОстатки.Склад = РезервыТоваровОстатки.Склад
GROUP BY ПартииТоваровОстатки.Товар
	, ПартииТоваровОстатки.Партия
	, ПартииТоваровОстатки.КонтрагентПартии
	, ПартииТоваровОстатки.Перевертыш
, ПартииТоваровОстатки.Склад 

  
Наверх
ICQ  
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Можно ли ускорить время выполнения запроса???
Ответ #1 - 26. Января 2010 :: 09:35
Печать  
Текст запроса с Отладка(1) в студию и план запроса в текстовом виде, пожалуйста.
  
Наверх
IP записан
 
Bagirius
Full Member
***
Отсутствует



Сообщений: 135
Зарегистрирован: 19. Февраля 2008
Пол: Мужской
Re: Можно ли ускорить время выполнения запроса???
Ответ #2 - 26. Января 2010 :: 09:39
Печать  
Два регистра ПартииТоваров и РезервыТоваров по структуре одинаковые, объединяются и выдают ТЗ с остатками по списку товаров
  
Наверх
ICQ  
IP записан
 
Bagirius
Full Member
***
Отсутствует



Сообщений: 135
Зарегистрирован: 19. Февраля 2008
Пол: Мужской
Re: Можно ли ускорить время выполнения запроса???
Ответ #3 - 26. Января 2010 :: 09:44
Печать  
leshik писал(а) 26. Января 2010 :: 09:35:
Текст запроса с Отладка(1) в студию и план запроса в текстовом виде, пожалуйста.

Код
Выбрать все
SELECT ПартииТоваровОстатки.Товар [Товар $Справочник.Номенклатура]
	, ПартииТоваровОстатки.Партия [Партия $Документ]
,ПартииТоваровОстатки.Склад [Склад $Справочник.МестаХранения]
	, ПартииТоваровОстатки.КонтрагентПартии [КонтрагентПартии $Справочник.Контрагенты]
	, ПартииТоваровОстатки.Перевертыш
	, Sum(ПартииТоваровОстатки.ОстатокТовараОстаток) КонОст
	, Sum(РезервыТоваровОстатки.РезервТовараОстаток) КонРез
	, Sum(ПартииТоваровОстатки.СебестоимостьОстаток) КонСеб
	, Sum(ПартииТоваровОстатки.ВалютнаяСебестоимостьОстаток) КонВСеб
FROM (
select
rr4268_vt.sp4270 as Товар,
rr4268_vt.sp4271 as Партия,
rr4268_vt.sp6199 as Перевертыш,
rr4268_vt.sp4273 as Склад,
rr4268_vt.sp4275 as КонтрагентПартии,
sum(rr4268_vt.sp4276) as ОстатокТовараОстаток,
sum(rr4268_vt.sp4277) as СебестоимостьОстаток,
sum(rr4268_vt.sp4279) as ВалютнаяСебестоимостьОстаток
from (
select
rg4268_vt.sp4270,
rg4268_vt.sp4271,
rg4268_vt.sp6199,
rg4268_vt.sp4273,
rg4268_vt.sp4275,
rg4268_vt.sp4276,
rg4268_vt.sp4277,
rg4268_vt.sp4279
from rg4268 as rg4268_vt (nolock)
where rg4268_vt.period={d '2009-12-01'}
and ((rg4268_vt.sp4270 IN (SELECT val FROM #ВыбТовары)) 		AND (rg4268_vt.sp4269 = '     1   '))
union all
select
ra4268_vt.sp4270,
ra4268_vt.sp4271,
ra4268_vt.sp6199,
ra4268_vt.sp4273,
ra4268_vt.sp4275,
case ra4268_vt.debkred when 0 then ra4268_vt.sp4276 else -ra4268_vt.sp4276 end,
case ra4268_vt.debkred when 0 then ra4268_vt.sp4277 else -ra4268_vt.sp4277 end,
case ra4268_vt.debkred when 0 then ra4268_vt.sp4279 else -ra4268_vt.sp4279 end
from ra4268 as ra4268_vt (nolock)
where ra4268_vt.date_time_iddoc > '20100101' and ra4268_vt.date_time_iddoc < '20100125D96HXC  2IAYCB0'
and ((ra4268_vt.sp4270 IN (SELECT val FROM #ВыбТовары)) 		AND (ra4268_vt.sp4269 = '     1   '))
) as rr4268_vt
group by
rr4268_vt.sp4270,
rr4268_vt.sp4271,
rr4268_vt.sp6199,
rr4268_vt.sp4273,
rr4268_vt.sp4275
having
sum(rr4268_vt.sp4276) <> 0 or
sum(rr4268_vt.sp4277) <> 0 or
sum(rr4268_vt.sp4279) <> 0
) as ПартииТоваровОстатки
	LEFT OUTER JOIN (
select
rr3871_vt.sp3873 as Товар,
rr3871_vt.sp4287 as Партия,
rr3871_vt.sp3875 as Склад,
rr3871_vt.sp6429 as Перевертыш,
sum(rr3871_vt.sp3877) as РезервТовараОстаток
from (
select
rg3871_vt.sp3873,
rg3871_vt.sp4287,
rg3871_vt.sp3875,
rg3871_vt.sp6429,
rg3871_vt.sp3877
from rg3871 as rg3871_vt (nolock)
where rg3871_vt.period={d '2009-12-01'}
and ((rg3871_vt.sp3873 IN (SELECT val FROM #ВыбТовары)) 		AND (rg3871_vt.sp3872 = '     1   '))
union all
select
ra3871_vt.sp3873,
ra3871_vt.sp4287,
ra3871_vt.sp3875,
ra3871_vt.sp6429,
case ra3871_vt.debkred when 0 then ra3871_vt.sp3877 else -ra3871_vt.sp3877 end
from ra3871 as ra3871_vt (nolock)
where ra3871_vt.date_time_iddoc > '20100101' and ra3871_vt.date_time_iddoc < '20100125D96HXC  2IAYCB0'
and ((ra3871_vt.sp3873 IN (SELECT val FROM #ВыбТовары)) 		AND (ra3871_vt.sp3872 = '     1   '))
) as rr3871_vt
group by
rr3871_vt.sp3873,
rr3871_vt.sp4287,
rr3871_vt.sp3875,
rr3871_vt.sp6429
having
sum(rr3871_vt.sp3877) <> 0
) as РезервыТоваровОстатки
	ON ПартииТоваровОстатки.Товар = РезервыТоваровОстатки.Товар
	AND ПартииТоваровОстатки.Партия = РезервыТоваровОстатки.Партия
	AND ПартииТоваровОстатки.Перевертыш = РезервыТоваровОстатки.Перевертыш
	AND ПартииТоваровОстатки.Склад = РезервыТоваровОстатки.Склад
GROUP BY ПартииТоваровОстатки.Товар
	, ПартииТоваровОстатки.Партия
	, ПартииТоваровОстатки.КонтрагентПартии
	, ПартииТоваровОстатки.Перевертыш
, ПартииТоваровОстатки.Склад 



Вот такая вот хрень, но в этом я не бум-бум Печаль
  
Наверх
ICQ  
IP записан
 
Bagirius
Full Member
***
Отсутствует



Сообщений: 135
Зарегистрирован: 19. Февраля 2008
Пол: Мужской
Re: Можно ли ускорить время выполнения запроса???
Ответ #4 - 26. Января 2010 :: 09:47
Печать  
конфигурация самописная
  
Наверх
ICQ  
IP записан
 
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Можно ли ускорить время выполнения запроса???
Ответ #5 - 26. Января 2010 :: 09:59
Печать  
Может быть попробовать:
1. Условие по фильтру товаров писать не ... IN ...., а посредством внутреннего соединения? (в качестве параметра ВТ передать строку соединения)
2. Сделать не левое соединение между таблицами остатков, а просто объединение двух таблиц?
Я конечно не берусь говорить что предложенные пути будут хоть сколько нибудь оптимальнее, но попробовать стоит мне кажется.  Круглые глаза
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Можно ли ускорить время выполнения запроса???
Ответ #6 - 26. Января 2010 :: 10:10
Печать  
Повторюсь еще раз - автору можно помочь только в случае наличия плана выполнения запроса:
http://www.sql.ru/faq/faq_topic.aspx?fid=393
  
Наверх
IP записан
 
Bagirius
Full Member
***
Отсутствует



Сообщений: 135
Зарегистрирован: 19. Февраля 2008
Пол: Мужской
Re: Можно ли ускорить время выполнения запроса???
Ответ #7 - 26. Января 2010 :: 21:57
Печать  
leshik писал(а) 26. Января 2010 :: 10:10:
Повторюсь еще раз - автору можно помочь только в случае наличия плана выполнения запроса:
http://www.sql.ru/faq/faq_topic.aspx?fid=393

К сожалению в этом я ДАЛЕК Печаль
  
Наверх
ICQ  
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Можно ли ускорить время выполнения запроса???
Ответ #8 - 27. Января 2010 :: 06:17
Печать  
Bagirius писал(а) 26. Января 2010 :: 21:57:
leshik писал(а) 26. Января 2010 :: 10:10:
Повторюсь еще раз - автору можно помочь только в случае наличия плана выполнения запроса:
http://www.sql.ru/faq/faq_topic.aspx?fid=393

К сожалению в этом я ДАЛЕК Печаль

Тогда сформулируй задачу в "человечиских" терминах
Сколько элементов в списке товаров ?
Какие наиболее частые значения Даты ?
и.т.д. чем лучше сформулируешь задачу тем вероятней получишь
правильный совет.
  
Наверх
 
IP записан
 
Вадимко
God Member
*****
Отсутствует


Нам бы чего про ОдноЦэ...

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Можно ли ускорить время выполнения запроса???
Ответ #9 - 05. Февраля 2010 :: 22:56
Печать  
Структура, говоришь, одинаковая?
А это что?

           (Товар, Партия, Перевертыш, Склад, КонтрагентПартии),) AS ПартииТоваровОстатки
....
           (Товар, Партия, Склад, Перевертыш),) AS Резервы

У меня подозрения что строки размножаются по количеству контрагентов каждой партии
А вообще-то такие вещи всегда делаю через union all
Как показывает практика могут быть неожиданности типа резервов без остатков, отрицательных резервов и т.п.
  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
Leierkastenmann
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 114
Зарегистрирован: 30. Марта 2007
Re: Можно ли ускорить время выполнения запроса???
Ответ #10 - 08. Февраля 2010 :: 10:09
Печать  
По-моему тоже лучше попытаться без левых соединений обойтись, использовав union. Если регистры большие, то два подзапроса, вычисляющие остатки будут долго соединяться.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать