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


1C++ rocks!

Сообщений: 61
Зарегистрирован: 16. Сентября 2010
Помогите оптимизировать запрос
05. Марта 2011 :: 18:56
Печать  
В функцию передан документ парЗаявка (тип Документ.ЗаявкаПокупателя). Необходимо проверить есть ли у него подчиненный проведенный документ "ОтменаЗаявкиПокупателя". У "ОтменыЗаявкиПокупателя" в шапке есть реквизит "ДокОснование" тип "Документ". Именно по этому реквизиту и связываются эти документы.
Вот рабочий запрос:
ТекстЗапроса = "
                             |SELECT
                             |      Док.IDDoc [ОтменаЗаявкиПокупателя $Документ.ОтменаЗаявкиПокупателя]
                             |FROM
                             |      $Документ.ОтменаЗаявкиПокупателя Док
                             |INNER JOIN
                             |  _1SJourn Жур ON Жур.IDDoc = Док.IDDoc AND
                             |                  Жур.Closed & 1 = 1
                             |WHERE
                             |      $Док.ДокОснование = :ВыбДок~
                             |";
                                   
                             RS.УстановитьТекстовыйПараметр("ВыбДок",парЗаявка);
                             
                             ТабЗаказы = RS.ВыполнитьИнструкцию(ТекстЗапроса,ТабЗаказы,1);
                             Если ТабЗаказы.КоличествоСтрок() > 0 Тогда
                                 // есть отмена
                             КонецЕсли;

Запрос рабочий, но в массовых проведениях съедает 49% времени выполнения.
Возможно ли как-то оптимизировать этот запрос?
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Помогите оптимизировать запрос
Ответ #1 - 05. Марта 2011 :: 20:10
Печать  
Код
Выбрать все
SELECT COUNT(*) ЧтотоЕсть
FROM _1SCRDOC AS Отбор With (NOLOCK)
	INNER JOIN _1SJOURN AS Журнал With (NOLOCK) ON Отбор.CHILD_DATE_TIME_IDDOC = Журнал.DATE_TIME_IDDOC
WHERE (Отбор.MDID = 0)
	AND (Отбор.PARENTVAL = :ВыбДок *)
	AND (Журнал.IDDOCDEF = $ВидДокумента.ОтменаЗаявкиПокупателя)
	AND (Журнал.CLOSED&1 = 1) 


Код
Выбрать все
Если RS.ВыполнитьСкалярный(ТекстЗапроса) > 0 Тогда
	// есть отмена
КонецЕсли; 


  

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


1C++ rocks!

Сообщений: 61
Зарегистрирован: 16. Сентября 2010
Re: Помогите оптимизировать запрос
Ответ #2 - 05. Марта 2011 :: 20:23
Печать  
А если документ "ОтменаЗаявкиПокупателя" не вводился на основании, а просто проводился с заполненным реквизитом "ДокОснование".
Тогда этот запрос не будет работать.
Что тогда делать?
  
Наверх
 
IP записан
 
zk96
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 320
Местоположение: Киев
Зарегистрирован: 15. Ноября 2009
Пол: Мужской
Re: Помогите оптимизировать запрос
Ответ #3 - 05. Марта 2011 :: 20:56
Печать  
А можно попробовать вот так
ТекстЗапроса = "
     |declare @ret bit
     |set @ret = 0
     |if
     |      exists(
     |            select *
     |from
     |      $Документ.ОтменаЗаявкиПокупателя Док
     |inner join
     |  _1SJourn Жур ON Жур.IDDoc = Док.IDDoc AND
     |                  Жур.Closed & 1 = 1
     |where
     |      $Док.ДокОснование = :ВыбДок~
     |) set @ret = 1
     |select @ret
     |";
     RS.УстановитьТекстовыйПараметр("ВыбДок",парЗаявка);
     ret=RS.ВыполнитьСкалярный(ТекстЗапроса);
     Если ret=1 Тогда
           //есть доки
     Иначе
     КонецЕсли;
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Помогите оптимизировать запрос
Ответ #4 - 05. Марта 2011 :: 21:09
Печать  
Foma писал(а) 05. Марта 2011 :: 20:23:
А если документ "ОтменаЗаявкиПокупателя" не вводился на основании, а просто проводился с заполненным реквизитом "ДокОснование".
Тогда этот запрос не будет работать.

Чёта ржу  Смех Какая разница, как он вводился? Достаточно того, что он подчинённый.
  

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


1C++ rocks!

Сообщений: 61
Зарегистрирован: 16. Сентября 2010
Re: Помогите оптимизировать запрос
Ответ #5 - 06. Марта 2011 :: 06:01
Печать  
berezdetsky писал(а) 05. Марта 2011 :: 21:09:
Foma писал(а) 05. Марта 2011 :: 20:23:
А если документ "ОтменаЗаявкиПокупателя" не вводился на основании, а просто проводился с заполненным реквизитом "ДокОснование".
Тогда этот запрос не будет работать.

Чёта ржу  Смех Какая разница, как он вводился? Достаточно того, что он подчинённый.


У меня было не утверждение, а вопрос, просто ? не поставил.
Т.е. даже если документ вводится не на основании, у него устанавливается реквизит "ДокОснование", то он все равно будет подчиненный?
  
Наверх
 
IP записан
 
Foma
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 61
Зарегистрирован: 16. Сентября 2010
Re: Помогите оптимизировать запрос
Ответ #6 - 06. Марта 2011 :: 06:04
Печать  
zk96 писал(а) 05. Марта 2011 :: 20:56:
А можно попробовать вот так
ТекстЗапроса = "
     |declare @ret bit
     |set @ret = 0
     |if
     |      exists(
     |            select *
     |from
     |      $Документ.ОтменаЗаявкиПокупателя Док
     |inner join
     |  _1SJourn Жур ON Жур.IDDoc = Док.IDDoc AND
     |                  Жур.Closed & 1 = 1
     |where
     |      $Док.ДокОснование = :ВыбДок~
     |) set @ret = 1
     |select @ret
     |";
     RS.УстановитьТекстовыйПараметр("ВыбДок",парЗаявка);
     ret=RS.ВыполнитьСкалярный(ТекстЗапроса);
     Если ret=1 Тогда
           //есть доки
     Иначе
     КонецЕсли;


Работает, но выйгрыш в скорости мизерный. Вместо 49% стало 47%.
Но всё равно спасибо.
  
Наверх
 
IP записан
 
zk96
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 320
Местоположение: Киев
Зарегистрирован: 15. Ноября 2009
Пол: Мужской
Re: Помогите оптимизировать запрос
Ответ #7 - 06. Марта 2011 :: 09:11
Печать  
А запрос от berezdetsky ты попробовал?
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Помогите оптимизировать запрос
Ответ #8 - 09. Марта 2011 :: 06:02
Печать  
Как вариант - подойти более глобально:
реквизит ДокОснование делаем общим реквизитом с отбором (я так понимаю, он уже общий реквизит документов - т.е. просто добавляем отбор).
В принципе, уже достаточно - далее пишем примерно такой же запрос, только не по таблице шапки документа, а по таблице _1SJourn.

Более продвинутый вариент - в пару к этому реквизиту создается общий реквизит с отбором "идДок13", который заполняется триггером (только надо не забывать, что 1Ска грохает триггер при затрагивании таблицы журнала - т.е. триггер надо пересоздавать).
Но это становится актуально для всяких хитрых запросов, когда тебе надо к выборке документов заджойнить подчиненные/основания.
  
Наверх
 
IP записан
 
Foma
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 61
Зарегистрирован: 16. Сентября 2010
Re: Помогите оптимизировать запрос
Ответ #9 - 10. Марта 2011 :: 04:02
Печать  
Запрос от berezdetsky попробовал, работает быстро, спасибо.
Сделал по другому.
Переписал несколько процедур, чтобы не для каждого документа вызывалось, а сразу для всех и потом разбор.
Работает еще быстрее.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать