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


I Love YaBB 2!

Сообщений: 256
Зарегистрирован: 01. Июня 2006
Оптимизация запроса
26. Ноября 2007 :: 06:42
Печать  
Оптимизирую запрос для ТП по журналу документов.
Есть 2 варианта реализации фильтра по видам документов:
Код
Выбрать все
select top 20
Жур.Date_Time_IDDoc as Позиция,
Жур.row_id as row_id,
Жур.IDDoc as Документ,
Жур.IDDocDef as Документ_вид,
...
from _1SJourn as Жур (NOLOCK)
INNER JOIN
	FVD_4245 as FilterDK (NOLOCK) ON
		Жур.IDDocDef = FilterDK.DocKindNum AND FilterDK.Used = 1
....
where (Жур.DATE_TIME_IDDOC BETWEEN '20071125' AND '20071125Z')
order by Жур.Date_Time_IDDoc, Жур.row_id 


и
Код
Выбрать все
select top 20
Жур.Date_Time_IDDoc as Позиция,
Жур.row_id as row_id,
Жур.IDDoc as Документ,
Жур.IDDocDef as Документ_вид,
...
from _1SJourn as Жур (NOLOCK)
....
where
Жур.IDDocDef in (SELECT  FilterDK.DocKindNum FROM FVD_4245 as FilterDK (NOLOCK) WHERE FilterDK.Used = 1) AND
(Жур.DATE_TIME_IDDOC BETWEEN '20071125' AND '20071125Z')
order by Жур.Date_Time_IDDoc, Жур.row_id 


В действительности запрос меняется в зависимости от наложеных фильтров.
Таблица FVD_4245 содержит 2 колонки: DocKindNum и Used. Пояснений, я думаю, не надо Улыбка
Второй вариант также пробовал сделать со списком видов документов.
Выражение порядка также может содержать Жур.IDDocDef, если отмечен всего один вид документов.
У меня первый вариант работает быстрее, однако, стандартный журнал с включеным отбором пользуется вторым вариантом (там просто сравнение идёт на один вид документов) и он ещё быстрее.
Подскажите, pls какой алгоритм с вашей точки зрения быстрее и предпочтительнее. Может надо к-либо индексы наложить на таблицы? К сожалению, теорию не приходилось изучать, а практики в этой области пока не хватает Печаль
  
Наверх
 
IP записан
 
slider26
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 256
Зарегистрирован: 01. Июня 2006
Re: Оптимизация запроса
Ответ #1 - 26. Ноября 2007 :: 06:51
Печать  
Кстати, в запросе использовался джойн с таблицами шапок документов, а затем для граф выражение  COALESCE()
со списком всех граф. Я это заменил на CASE с SELECTом:
Код
Выбрать все
CASE Жур.IDDocDef
	WHEN 1762 THEN (SELECT TOP 1 sp1760 FROM dh1762 (NOLOCK) WHERE dh1762 .IDDOC = Жур.IDDOC)
	WHEN 388 THEN (SELECT TOP 1 sp577 FROM dh388 (NOLOCK) WHERE dh388 .IDDOC = Жур.IDDOC)
	WHEN 2015 THEN (SELECT TOP 1 sp2012 FROM dh2015 (NOLOCK) WHERE dh2015 .IDDOC = Жур.IDDOC)
	WHEN 88 THEN (SELECT TOP 1 sp423 FROM dh88 (NOLOCK) WHERE dh88 .IDDOC = Жур.IDDOC)
	WHEN 297 THEN (SELECT TOP 1 sp2590 FROM dh297 (NOLOCK) WHERE dh297 .IDDOC = Жур.IDDOC)
	WHEN 315 THEN (SELECT TOP 1 sp318 FROM dh315 (NOLOCK) WHERE dh315 .IDDOC = Жур.IDDOC)
	WHEN 664 THEN (SELECT TOP 1 sp959 FROM dh664 (NOLOCK) WHERE dh664 .IDDOC = Жур.IDDOC)
	WHEN 3456 THEN (SELECT TOP 1 sp3449 FROM dh3456 (NOLOCK) WHERE dh3456 .IDDOC = Жур.IDDOC)
	WHEN 2291 THEN (SELECT TOP 1 sp2286 FROM dh2291 (NOLOCK) WHERE dh2291 .IDDOC = Жур.IDDOC)
END as Сумма,
 


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