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



Сообщений: 74
Местоположение: Красноярск
Зарегистрирован: 19. Марта 2008
Пол: Мужской
Прямой запрос отрабатывает медленнее штатного перебора
29. Июля 2011 :: 03:50
Печать  
Нужно выбрать заявки и подчиненые им реализации за определенную дату. Текст запроса:
Код
Выбрать все
ТекстЗапроса = "SELECT Заявка.IDDOC [Ссылка $Документ.Заявка]
		|	, Реализация.IDDOC [Реализация $Документ.Реализация]
		|FROM $Документ.Заявка AS Заявка
		|	INNER JOIN _1SJOURN AS Журнал ON Заявка.IDDOC = Журнал.IDDOC
		|	LEFT JOIN $Документ.Реализация AS Реализация ON $ВидДокумента36.Заявка + Заявка.IDDOC = $Реализация.ДокОснование
		|WHERE (Cast(Left(Журнал.DATE_TIME_IDDOC, 8) AS datetime) = :ВыбДата)
		|	AND (Журнал.ISMARK = 0)"; 



Этот запрос отрабатывается примерно в 10 раз медленнее чем штатный перебор документов:
Код
Выбрать все
	тз = СоздатьОбъект("ТаблицаЗначений");
	тз.НоваяКолонка("Ссылка");
	тз.НоваяКолонка("Реализация");

	Док = СоздатьОбъект("Документ");
	Заявка = СоздатьОбъект("Документ.Заявка");
	Заявка.ВыбратьДокументы(ТекДата, ТекДата);
	Пока Заявка.ПолучитьДокумент() = 1 Цикл
		Если Заявка.ПометкаУдаления() = 1 Тогда
			Продолжить;
		КонецЕсли;

		тз.НоваяСтрока();
		тз.Ссылка = Заявка.ТекущийДокумент();

		Если Док.ВыбратьПодчиненныеДокументы(,,Заявка.ТекущийДокумент()) = 1 Тогда
			Док.ПолучитьДокумент();
			тз.Реализация = Док.ТекущийДокумент();
		КонецЕсли;
	КонецЦикла; 

  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Прямой запрос отрабатывает медленнее штатного перебора
Ответ #1 - 29. Июля 2011 :: 04:36
Печать  
1. Индекс
WHERE Журнал.DATE_TIME_IDDOC between :ВыбДата and :ВыбДата~
    AND Журнал.IDDOCDEF = $ВидДокумента.Заявка
    AND Журнал.ISMARK = 0


2. (nolock) везде по принципу $Документ.Заявка AS Заявка (nolock)

3. вместо LEFT JOIN $Документ.Реализация
использовать таблицу подчинения _1scrdoc в корр.запросе:

,(select top 1 right(cr.child_date_time_iddoc,9)
    from _1scrdoc cr (nolock)
    where cr.mdid = 0
     and cr.parentval = 'O1'+$ВидДокумента36.Заявка + Заявка.IDDOC
    order by cr.child_date_time_iddoc
) [Реализация $Документ.Реализация]
  

1&&2&&3
Наверх
 
IP записан
 
Андрюха
Junior Member
**
Отсутствует



Сообщений: 74
Местоположение: Красноярск
Зарегистрирован: 19. Марта 2008
Пол: Мужской
Re: Прямой запрос отрабатывает медленнее штатного перебора
Ответ #2 - 29. Июля 2011 :: 09:07
Печать  
Спасибо, очень помогло! Причем после выполнения запроса один раз все последующие попытки отрабатывают практически мгновенно, видимо SQL сервер где-то кеширует данные.
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Прямой запрос отрабатывает медленнее штатного перебора
Ответ #3 - 01. Августа 2011 :: 03:12
Печать  
Андрюха писал(а) 29. Июля 2011 :: 09:07:
Спасибо, очень помогло! Причем после выполнения запроса один раз все последующие попытки отрабатывают практически мгновенно, видимо SQL сервер где-то кеширует данные.


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