Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Помогите оптимизировать запрос (число прочтений - 2889 )
pavel_tr
Senior Member
****
Отсутствует



Сообщений: 279
Местоположение: Казань
Зарегистрирован: 14. Октября 2006
Пол: Мужской
Помогите оптимизировать запрос
15. Декабря 2006 :: 07:36
Печать  
В конфе есть справочник товаров и подчинённый ему справочник партий. У партии реквизит накладная - ссылка на документ.приходная, которой она создалась. "Новинки" за период - те товары, у которых дата накладной, создавшей первую партию, входит в заданный диапазон. Написал запрос, чтобы их вытаскивать, но работает не так быстро, как хотелось бы (хоть и быстрее оригинальной обработки раза в два  Улыбка )

Код
Выбрать все
               |SELECT
	|tov.CODE Код,
	|$tov.ISBN ISBN,
	|$tov.Автор Автор,
	|tov.DESCR Наименование,
	|izd.DESCR Издательство,
	|SUM($r.Остаток) Остат,
	|$tov.Цена Цена
	|FROM	( SELECT
	|		sel.tov,
	|		MIN(prt.CODE) code
	| 	 FROM	( SELECT
	|			$docs.Товар tov
	|	 	  FROM _1SJourn j (NoLock)
	|		      inner join $Документ.Приходная doc (NoLock) on doc.iddoc = j.iddoc
	|			AND $doc.Получатель = :ВыбСклад
	|		      inner join $ДокументСтроки.Приходная docs (NoLock) on docs.iddoc = j.iddoc
	|	 	  WHERE
	|	              	j.Date_time_iddoc BETWEEN :НачДата AND :КонДата~
	|			          AND j.Closed&1=1
	|	 	  GROUP BY $docs.Товар ) as sel
	|
	|			left join $Справочник.Партии prt (NoLock) on prt.PARENTEXT = sel.tov
	|			              AND prt.ISMARK = 0 AND $prt.Накладная <> $ПустойИД
	| 		  GROUP BY sel.tov ) as sel1
	|
	|				inner join $Справочник.Товары tov (NoLock) on tov.id = sel1.tov
	|				inner join $Справочник.Партии prt (NoLock) on prt.code = sel1.code
	|				inner join _1SJourn j (NoLock) on j.iddoc = $prt.Накладная AND j.Date_time_iddoc > :НачДата
	|				left join $Справочник.Издательства izd (NoLock) on izd.id = $tov.Издательство
	|				left join $РегистрИтоги.Остатки r (NoLock)
	|						on r.PERIOD = '"+стрдатыТА+"' AND $r.Товар = sel1.tov AND $r.Склад = :ВыбСклад
	|
	|GROUP BY tov.CODE, $tov.ISBN, $tov.Автор, tov.DESCR, izd.DESCR, $tov.Цена
	|ORDER BY tov.Descr"; 



Алгоритм такой:
1. Выбираем товар из приходных за период
2. Выдергиваем код минимальной партии для каждого товара
3. Смотрим поле "Накладная" у партий и Join'ами убираем товар, который не попадает в заданный период

Для 10 000 с небольшим элементов работает полторы-две минуты. Отдельно делал подзапросы, бОльшая часть времени тратится на поиск минимальной партии.

Пожалуйста, помогите оптимизировать алгоритм. Нужно переписать первый подзапрос, искать минимальную партию и Join'ить _1SJourn с условием по дате. Сам пробовал, но не получилось.
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Помогите оптимизировать запрос
Ответ #1 - 15. Декабря 2006 :: 10:11
Печать  
pavel_tr писал(а) 15. Декабря 2006 :: 07:36:
Для 10 000 с небольшим элементов работает полторы-две минуты. Отдельно делал подзапросы, бОльшая часть времени тратится на поиск минимальной партии.

Пожалуйста, помогите оптимизировать алгоритм. Нужно переписать первый подзапрос, искать минимальную партию и Join'ить _1SJourn с условием по дате. Сам пробовал, но не получилось.

Попробуй
Код
Выбрать все
select prt.parentext tov
from $Справочник.Партии prt (NoLock)
    inner join _1sjourn j (nolock) on $prt.Накладная = j.iddoc
group by prt.parentext
having min(j.date_time_iddoc) > :НачДата 

  

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


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

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Помогите оптимизировать запрос
Ответ #2 - 15. Декабря 2006 :: 10:21
Печать  
Я бы действовал проще  Озадачен

Код
Выбрать все
		|SELECT Номенклатура.ID [Ссылка $Справочник.Номенклатура]
		|	, Min(Партии.ID) [ПартииСсылка $Справочник.Партии]
		|FROM $Справочник.Номенклатура AS Номенклатура
		|	INNER JOIN $Справочник.Партии AS Партии ON Номенклатура.ID = Партии.PARENTEXT
		|	INNER JOIN _1SJOURN AS Журнал ON RIGHT($Партии.ПриходныйДокумент,9) = Журнал.IDDOC
		|WHERE (Журнал.DATE_TIME_IDDOC BETWEEN :НачДата AND :КонДата~)
		|GROUP BY Номенклатура.ID
		|";

 



Только надо подумать надо соединением с журналом, может ступил
  

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



Сообщений: 279
Местоположение: Казань
Зарегистрирован: 14. Октября 2006
Пол: Мужской
Re: Помогите оптимизировать запрос
Ответ #3 - 16. Декабря 2006 :: 10:52
Печать  
(1) Спасибо, это идея! Буду пробовать
(2) Не совсем то, так мы получим все созданные партии за период (не важно, будет она первой для товара или нет), а нужно по сути выбрать товары, у которых только 1я партия из заданного диапазона

Огромное всем спасибо!
  
Наверх
 
IP записан
 
Вадимко
God Member
*****
Отсутствует


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

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Помогите оптимизировать запрос
Ответ #4 - 16. Декабря 2006 :: 14:49
Печать  
>>так мы получим все созданные партии за период
я бы не был столь категоричен...
  

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



Сообщений: 279
Местоположение: Казань
Зарегистрирован: 14. Октября 2006
Пол: Мужской
Re: Помогите оптимизировать запрос
Ответ #5 - 18. Декабря 2006 :: 08:33
Печать  
Основные тормоза были не в партиях, а в получении остатков. Вынес в отдельный запрос, всё работает за 20-30 секунд вместо 2 минут  Подмигивание
  
Наверх
 
IP записан
 
Вадимко
God Member
*****
Отсутствует


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

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Помогите оптимизировать запрос
Ответ #6 - 18. Декабря 2006 :: 10:02
Печать  
Вот с остатками на ТА для СКЛ (для ДБФ надо итоги вместо ВТ)

Код
Выбрать все
|SELECT ОстаткиТМЦОстатки.Номенклатура [Номенклатура $Справочник.Номенклатура]
		|	, Min(Партии.ID) [Ссылка $Справочник.Партии]
		|FROM $РегистрОстатки.ОстаткиТМЦ(,
		|		INNER JOIN $Справочник.Партии AS Партии With (NOLOCK) ON Номенклатура = Партии.PARENTEXT
		|		INNER JOIN _1SJOURN AS Журнал With (NOLOCK) ON RIGHT($Партии.ПриходныйДокумент,9) = Журнал.IDDOC,
		|		(Журнал.DATE_TIME_IDDOC BETWEEN :НачДата AND :КонДата~),
		|		Номенклатура,) AS ОстаткиТМЦОстатки
		|	INNER JOIN $Справочник.Партии AS Партии With (NOLOCK) ON ОстаткиТМЦОстатки.Номенклатура = Партии.PARENTEXT
		|	INNER JOIN _1SJOURN AS Журнал With (NOLOCK) ON RIGHT($Партии.ПриходныйДокумент,9) = Журнал.IDDOC
		|WHERE (Журнал.DATE_TIME_IDDOC BETWEEN :НачДата AND :КонДата~)
		|GROUP BY ОстаткиТМЦОстатки.Номенклатура
 

  

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



Сообщений: 279
Местоположение: Казань
Зарегистрирован: 14. Октября 2006
Пол: Мужской
Re: Помогите оптимизировать запрос
Ответ #7 - 18. Декабря 2006 :: 10:59
Печать  
Пасибо, попробую
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать