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


1C++ rocks!

Сообщений: 32
Зарегистрирован: 25. Февраля 2010
возможно-ли оптимизировать запрос
25. Февраля 2010 :: 16:16
Печать  
Уважаемые гуру!
Данный запрос работоспособен при малом обьёме данных.
Есть ли какие либо пути по оптимизации????
при запросе за период (месяц) процесс 1С начинает сьедать всё больше и больше памяти пока 1С не обваливается из за рунтайм эрор.
если закоментировать джоин с рег партии, но тогда невозможно будет посчитать себестоимость. Печаль
  

_____2.txt ( 5 KB | Загрузки )
Наверх
 
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: возможно-ли оптимизировать запрос
Ответ #1 - 25. Февраля 2010 :: 16:58
Печать  
А можно план запроса в текстовом виде?
  
Наверх
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: возможно-ли оптимизировать запрос
Ответ #2 - 25. Февраля 2010 :: 17:05
Печать  
А что за справочник такой $Справочник.ТоргНакл
Я правильно понимаю, что для того чтобы не изменять структуру документа был создан дополнительный справочник с Реквизитом "РН" типа "Документ. Т_РасходнаяНакладная" и в этот справочник пишутся все дополнительные реквизиты накладной?
Если это так - то скажите, стоит ли на реквизите "РН" признак "Сортировка"?
  
Наверх
IP записан
 
alexdd
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 347
Зарегистрирован: 25. Июня 2007
Re: возможно-ли оптимизировать запрос
Ответ #3 - 25. Февраля 2010 :: 20:45
Печать  
Соединять нужно по уникальному ключу, иначе получиться произведение множеств. Из-за этого и вылетает 1С - слишком много строк.
Код
Выбрать все
|  Left join $ДокументСтроки.Т_РасходнаяНакладная as РНСтроки on $ТН.РН = РНСтроки.IDDOC
|  Left join $Справочник.ТМЦ as тмц on $РНСтроки.Товар = тмц.ID
|  Left join $Регистр.ПартииТоваров as рег on РНСтроки.IDDoc = рег.IDDOC and РНСтроки.lineno_ = рег.lineno_  


и вместо этого
Код
Выбрать все
Inner join $Справочник.КатегорииТоваров AS КатегорииТоваров ON $РНСтроки.Товар = КатегорииТоваров.PARENTEXT 


Код
Выбрать все
where
 ...
 and exists(select * from $Справочник.КатегорииТоваров AS КатегорииТоваров where КатегорииТоваров.PARENTEXT = $рег.Товар and $КатегорииТоваров.Категория in (Select val from #_категория))
 


В результате будут все записи регистра ПартииТоваров для документов, попавших в выборку. Все-равно слишком большой объем данных тянуть. Нужно постановку задачи оптимизироватьУлыбка
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: возможно-ли оптимизировать запрос
Ответ #4 - 26. Февраля 2010 :: 06:15
Печать  
Цитата:
стоит ли на реквизите "РН" признак "Сортировка"?
в данном случае не поможет. Нужна сортировка по ДатаФактОтгрузки.

Цитата:
and РНСтроки.lineno_ = рег.lineno_
+1

и не забываем про nolock
  

1&&2&&3
Наверх
 
IP записан
 
Leierkastenmann
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 114
Зарегистрирован: 30. Марта 2007
Re: возможно-ли оптимизировать запрос
Ответ #5 - 26. Февраля 2010 :: 06:23
Печать  
Не факт, что по lineno_ можно будет соединение строить, вдруг там не используется ПривязыватьСтроку(). Но соединение с регистром партий и в самом деле здесь какое-то недоделанное, нужны еще условия, чтобы строк меньше было.
А вот менять join на exists смысла не вижу. Еще бы я не делал условие
Код
Выбрать все
$РНСтроки.Товар  in (Select val from #_товар) 


а поменял бы его на
Код
Выбрать все
тмц.ID  in (Select val from #_товар)  



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


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: возможно-ли оптимизировать запрос
Ответ #6 - 26. Февраля 2010 :: 06:32
Печать  
Leierkastenmann писал(а) 26. Февраля 2010 :: 06:23:
А вот менять join на exists смысла не вижу.

ну и зря именно MS SQL очень хорошо обрабатывает exists
(полусоеденения, антисоеденения ).
  
Наверх
 
IP записан
 
alexdd
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 347
Зарегистрирован: 25. Июня 2007
Re: возможно-ли оптимизировать запрос
Ответ #7 - 26. Февраля 2010 :: 06:38
Печать  
Leierkastenmann писал(а) 26. Февраля 2010 :: 06:23:
А вот менять join на exists смысла не вижу.

смысл в том, что одного товара может быть несколько записей в справочнике КатегорииТоваров с одинаковым значением Категория. Можно джойнить и надеяться, что такого не будет или использовать exists.
Leierkastenmann писал(а) 26. Февраля 2010 :: 06:23:
Не факт, что по lineno_ можно будет соединение строить, вдруг там не используется ПривязыватьСтроку().

Не факт, но по-другому т.ч. с регистром никак не соединить.
  
Наверх
 
IP записан
 
elemenrad
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 32
Зарегистрирован: 25. Февраля 2010
Re: возможно-ли оптимизировать запрос
Ответ #8 - 26. Февраля 2010 :: 07:02
Печать  
вместо конструкции с lineno использую                  
|  Left join $Регистр.ПартииТоваров as рег on ПНСтроки.IDDoc = рег.IDDOC and $ПНСтроки.Товар = $рег.Товар

но итого сумма нереальная получается. щас разбераюсь чего.
по поводу экзист - при замене ним джойна я немогу получить колонку с категорией товара а она необходима! Можно поподробнее разьяснить как экзистом джоин заменить. Улыбка
всем помогающим +1 Подмигивание
  
Наверх
 
IP записан
 
Leierkastenmann
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 114
Зарегистрирован: 30. Марта 2007
Re: возможно-ли оптимизировать запрос
Ответ #9 - 26. Февраля 2010 :: 07:37
Печать  
Z1 писал(а) 26. Февраля 2010 :: 06:32:
Leierkastenmann писал(а) 26. Февраля 2010 :: 06:23:
А вот менять join на exists смысла не вижу.

ну и зря именно MS SQL очень хорошо обрабатывает exists
(полусоеденения, антисоеденения ).


Категория в шапке запроса, стало быть ни о каком exists речи не идет. Дополнительные условия можно добавлять, если автору нужны не все категории в результате.
А вообще спорить не буду, потому что нет однозначной рекомендации, все определяется планом выполнения. Довольно много запросов будут иметь одинаковый план, неважно join, in или exists используется.
Кстати, автор так и не привел плана запроса.

Цитата:
Не факт, но по-другому т.ч. с регистром никак не соединить.

Если знать модуль проведения документа, то быть может и есть какие-то обходные пути соединения, например, если гарантировано одна строка всегда делает одно движение, то вместо lineno_, можно в регистре использовать actno.
  
Наверх
 
IP записан
 
alexdd
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 347
Зарегистрирован: 25. Июня 2007
Re: возможно-ли оптимизировать запрос
Ответ #10 - 26. Февраля 2010 :: 07:50
Печать  
elemenrad писал(а) 26. Февраля 2010 :: 07:02:
вместо конструкции с lineno использую                  
|  Left join $Регистр.ПартииТоваров as рег on ПНСтроки.IDDoc = рег.IDDOC and $ПНСтроки.Товар = $рег.Товар

но итого сумма нереальная получается. щас разбераюсь чего.

строки "лишние", поэтому нереальная сумма. Соединять нужно по уникальному ключу.

elemenrad писал(а) 26. Февраля 2010 :: 07:02:
по поводу экзист - при замене ним джойна я немогу получить колонку с категорией товара а она необходима! Можно поподробнее разьяснить как экзистом джоин заменить. Улыбка

У одного товара может быть несколько категорий? Какую из них нужно получить?
  
Наверх
 
IP записан
 
elemenrad
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 32
Зарегистрирован: 25. Февраля 2010
Re: возможно-ли оптимизировать запрос
Ответ #11 - 26. Февраля 2010 :: 07:55
Печать  
каждому товару проставлена только одна категория. Метод Привязатьстроку() неиспользую. могу приадачить модуль проведения. фСуммы получились больше не в себестоимости а в колонке Сумма
  
Наверх
 
IP записан
 
Leierkastenmann
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 114
Зарегистрирован: 30. Марта 2007
Re: возможно-ли оптимизировать запрос
Ответ #12 - 26. Февраля 2010 :: 08:22
Печать  
elemenrad писал(а) 26. Февраля 2010 :: 07:55:
каждому товару проставлена только одна категория. Метод Привязатьстроку() неиспользую. могу приадачить модуль проведения. фСуммы получились больше не в себестоимости а в колонке Сумма


Ну давайте модуль, поглядим что можно выдумать.

Да, я тут подумал. Зачем соединение табличной части с регистром партий? Только одним регистром обойтись нельзя? Или может быть такое, что в ТЧ строка есть, а в регистре партий ее нет? И что каких-то реквизитов ТЧ нет в регистре партий?
  
Наверх
 
IP записан
 
elemenrad
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 32
Зарегистрирован: 25. Февраля 2010
Re: возможно-ли оптимизировать запрос
Ответ #13 - 26. Февраля 2010 :: 12:03
Печать  
прошу прощения, метод Привязатьстроку() используется
           |  Left join $Регистр.ПартииТоваров as рег on РНСтроки.IDDoc = рег.IDDOC and РНСтроки.lineno_ = рег.lineno_ and $РНСтроки.Товар = $рег.Товар
прекрасно работает, но всёравно сумма отличается от действительной Печаль
  
Наверх
 
IP записан
 
alexdd
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 347
Зарегистрирован: 25. Июня 2007
Re: возможно-ли оптимизировать запрос
Ответ #14 - 26. Февраля 2010 :: 12:08
Печать  
не получится там сумму из документа взять при соединении с регистром. Получилось бы, если бы колво строк в регистре было равно колву строк в документе.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать