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


I Love YaBB 2!

Сообщений: 27
Зарегистрирован: 13. Марта 2007
Помогите оптимизировать запрос
11. Июня 2007 :: 09:03
Печать  
Есть остаточный регистр "Остатки". Измерения: Товар. Реквизиты: ЦенаБезНДС .

Нужно получить последние цены прихода товара по заданному списку товаров.

Строю запрос:

СписокТоваровДляЗапросаЦен=СоздатьОбъект("СписокЗначений");
ВыгрузитьТабличнуюЧасть(СписокТоваровДляЗапросаЦен,"Товар");
ЗапросЦены=СоздатьОбъект("ODBCRecordSet");
ТекстЗапросаЦены="
|SELECT
|  $Рег.Товар [Товар  $Справочник.Номенклатура]
|, $Рег.ЦенаБезНДС as ЦенаЗакупкиБезНДС
|, CAST(LEFT(Жур.Date_Time_IDDoc,8) as DateTime) as День
|, Жур.IDDocDef as Док_вид
|FROM $Регистр.Остатки as Рег
|LEFT JOIN
|      _1SJourn as Жур
|ON
|      Рег.IDDoc=Жур.IDDoc
|WHERE
|      Жур.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~
|AND
|      Жур.IDDocDef=$ВидДокумента.ПриходнаяНакладная
|AND
|               $Рег.Товар IN (SELECT Val FROM #ГруппаТоваров)
|ORDER BY
|      $Рег.Товар, CAST(LEFT(Жур.Date_Time_IDDoc,8) as DateTime) DESC
|";

ЗапросЦены.УложитьСписокОбъектов(СписокТоваровДляЗапросаЦен, "#ГруппаТоваров","Номенклатура");
     
ЗапросЦены.УстановитьТекстовыйПараметр("НачДата",'01.01.1900');
кущийДокумент()));
тзЦены=ЗапросЦены.ВыполнитьИнструкцию(ТекстЗапросаЦены);

В результате выбираются все цены за всю базу, а потом я ищу в таблице последнее значение.
Все хорошо, беда в том, что база огромная и работает такой запрос очень долго. А можно как-то его оптимизировать и сразу в запросе получать последние значения цен?
  
Наверх
 
IP записан
 
pavel_tr
Senior Member
****
Отсутствует



Сообщений: 279
Местоположение: Казань
Зарегистрирован: 14. Октября 2006
Пол: Мужской
Re: Помогите оптимизировать запрос
Ответ #1 - 11. Июня 2007 :: 10:56
Печать  
ИМХО для твоей задачи нужно использовать ВТ остатки

По приведённому тексту запроса:
В запросе к регистру нет условия по полю PERIOD. Тебе нужны самые последние цены, т.е. остатки на ТА. И PERIOD в этом случае д.быть равен НачМесяца(ПолучитьДатуТА())

ЗЫ. Ещё вопрос. Для чего извлекается вот это:
|, CAST(LEFT(Жур.Date_Time_IDDoc,8) as DateTime) as День
|, Жур.IDDocDef as Док_вид

Ведь ты делаешь ВыгрузитьТабличнуюЧасть(СписокТоваровДляЗапросаЦен,"Товар"), соответственно и ДатаДок и ВидДокумента() тебе уже известны
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Помогите оптимизировать запрос
Ответ #2 - 11. Июня 2007 :: 11:09
Печать  
alex_gol писал(а) 11. Июня 2007 :: 09:03:
В результате выбираются все цены за всю базу, а потом я ищу в таблице последнее значение.
Все хорошо, беда в том, что база огромная и работает такой запрос очень долго. А можно как-то его оптимизировать и сразу в запросе получать последние значения цен?

Оптимизировать, конечно, можно.  Улыбка И гораздо проще и эффективнее это можно будет сделать, если включить отбор движений по измерению Товар.
  

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


I Love YaBB 2!

Сообщений: 27
Зарегистрирован: 13. Марта 2007
Re: Помогите оптимизировать запрос
Ответ #3 - 11. Июня 2007 :: 20:01
Печать  
berezdetsky писал(а) 11. Июня 2007 :: 11:09:
Оптимизировать, конечно, можно.  Улыбка И гораздо проще и эффективнее это можно будет сделать, если включить отбор движений по измерению Товар.


А можно написать подробнее, как именно. И что нам дает отбор движений по измерению?

To pavel_tr:
Прошу обратить внимание на то, что ЦенаБезНДС - это не ресурс, а реквизит регистра. Поэтому, в таблице остатков мы его не получим. А дату я выбираю для определения последней даты прихода.
« Последняя редакция: 12. Июня 2007 :: 00:34 - alex_gol »  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Помогите оптимизировать запрос
Ответ #4 - 12. Июня 2007 :: 08:03
Печать  
alex_gol писал(а) 11. Июня 2007 :: 20:01:
А можно написать подробнее, как именно.

Например,
Код
Выбрать все
|SELECT
|	$РегОстатки.Товар [Товар $Справочник.Номенклатура]
|	, $РегОстатки.ЦенаБезНДС ЦенаЗакупкиБезНДС
|	, sq.День
|FROM $Регистр.Остатки AS РегОстатки
|	INNER JOIN (SELECT $Рег.Товар Товар
|				, Right(Max(Жур.DATE_TIME_IDDOC), 9) IDDOC
|				, CAST(LEFT(Max(Жур.Date_Time_IDDoc),8) as DateTime) День
|			FROM $Регистр.Остатки AS Рег
|				INNER JOIN _1SJOURN AS Жур ON Рег.IDDOC = Жур.IDDOC
|			WHERE (Жур.DATE_TIME_IDDOC > :НачДата)
|				AND (Жур.DATE_TIME_IDDOC < :КонДата ~)
|				AND (Жур.IDDOCDEF = $ВидДокумента.ПриходнаяНакладная)
|				AND ($Рег.Товар IN (SELECT Val FROM #ГруппаТоваров))
|			GROUP BY $Рег.Товар
|		) sq ON (РегОстатки.IDDOC = sq.IDDOC)
|			AND ($РегОстатки.Товар = sq.Товар)
 


А, может быть, эффективнее будет обратиться к табличной части ПН..

alex_gol писал(а) 11. Июня 2007 :: 20:01:
И что нам дает отбор движений по измерению?

Можно будет выбросить из запроса таблицу _1sjourn и существенно ускорится отбор по товарам.
  

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


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

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Помогите оптимизировать запрос
Ответ #5 - 12. Июня 2007 :: 09:26
Печать  
pavel_tr писал(а) 11. Июня 2007 :: 10:56:
ИМХО для твоей задачи нужно использовать ВТ остатки


У него типа регистра сведений, ресурсов нет

  

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


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

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Помогите оптимизировать запрос
Ответ #6 - 12. Июня 2007 :: 09:31
Печать  
berezdetsky, имеет ли право на жизнь такое и что лучше? А то я, видимо, в свое время затупил
Это правда для ДБФ:

Код
Выбрать все
|SELECT $Цены.Номенклатура AS Ном
	|, $Цены.Цена AS Цена
	|FROM $Регистр.Цены AS Цены
	|WHERE ($Цены.Фирма = :ВыбФирма)
	|AND
	|Цены.IDDOC =
	|(
	|SELECT RIGHT(MAX(DTOS(Журнал.DATE) + Журнал.TIME + Журнал.IDDOC), 9)
	|FROM 1SJOURN AS Журнал
	|INNER JOIN $Регистр.Цены AS Цены1 ON Цены1.IDDOC = Журнал.IDDOC
	|WHERE ($Цены.Номенклатура = $Цены1.Номенклатура)
	|AND ($Цены1.Фирма = $Цены.Фирма)
	|)
 


  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Помогите оптимизировать запрос
Ответ #7 - 12. Июня 2007 :: 10:06
Печать  
Цитата:
berezdetsky, имеет ли право на жизнь такое и что лучше?

Если работает, то право имеет.
А насчёт лучше - ничего сказать не могу. Последний раз запрос для DBF я писал году эдак в 95. И то на Clipper.
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать