Страница 1 из 1

Помогите ускорить выполнение запроса

Добавлено: 05 июн 2004, 14:10
Mihail
Помогите ускорить выполнение запроса:

insert into @Pt select * from
select * from @T where Param1=@Par_i as A,
select * from @T3 where F_func_Bool
(param1,param2,param3,@Par_i)=1
as B
where Profit_func_scalar
(param1,param2,param3,param4) > Fr_funk_scalar (@k1,@k2,@K3)


F_func_Bool - логическая функция, Profit_func_scalar и Fr_funk_scalar - скалярные функции, @T,@T3 - таблицы по 20 000 записей

запрос выполняется в циклах достаточно часто,
думаю что если вместо функций подставить конкретное выражение запрос должен выполняться быстрее например

вместо F_func_Bool (param1,param2,param3,@)=1 --> param1>@Par_i
вместо Profit_func_scalar (param1,param2,param3,param4) > Fr_funk_scalar (@k1,@k2,@K3) --> 1/param4 > @K1

но для этого запрос нужно вызывать из текстовой переменной, заменяя функции конкретным выражением
Жду ответа от всех кто знает как это сделать или может предложить другой метод ускорить выполнение запроса

Добавлено: 05 июн 2004, 14:23
AiK
Mihail, вообще-то стандартная процедура оптимизации запроса начинается с изучения плана этого запроса. Из него будет видно, где именно твой запрос просаживается. Из практики где-то в 90% случаев где-нибудь идёт сканирование таблицы, т.е. индекса не хватает.

Добавлено: 02 июл 2004, 22:45
alexx
Mihail, не знаю какой у вас сервер. Но скорее всего надо ставить индексы на Fr_funk_scalar (@k1,@k2,@K3) и другие. Потом изучение плана чтоб избежать сканирование таблицы.

Добавлено: 02 июл 2004, 23:12
Oscar
А можно для необразованных пояснить, что такое "изучение плана запроса" ?

Добавлено: 03 июл 2004, 00:58
AiK
Oscar, слово изучение я не буду раскрывать, ок? :) А план запроса, он же query plan показывает какие таблицы и какие индексы участвуют в запросе. Подробнее - в мануале к серверу.
Пример запроса и его плана:

Код: Выделить всё

Query: SELECT au_lname, au_fname 
  FROM Authors 
 WHERE city = "Oakland" 

SHOWPLAN: STEP 1 
  The type of query is SELECT 
  FROM TABLE 
  authors 
  Nested iteration 
  Table Scan 
Это - плохой план. А вот так - хороший:

Код: Выделить всё

SHOWPLAN: STEP 1 
  The type of query is SELECT 
  FROM TABLE 
  authors 
  Nested iteration 
  Using Clustered Index
Разница - в использовании индекса.

Добавлено: 03 июл 2004, 02:05
Oscar
AiK, спасибо!
А ещё, если будешь столь любезным, можешь сказать о каком сервере идёт речь? Или эти планы общие для всех СУБД?
Скажи в каком мануале глянуть, плиз, для общего развития ..

Добавлено: 03 июл 2004, 10:33
AiK
Oscar, это злостный оффтопик. Пример привёл для MS SQL 6.5 -первый попавшийся под руку. Есть они во всех т.с. "промышленных" серваках. Т.е. в Sybase, MS SQL, Oracle, наверняка в DB2. Есс-но каждый выводит их как хочет, но смысл у всех общий. Мануалы (product manuals) на то и мануалы, чтобы вместе с продуктом поставляться :) .
У Sybase - Sybooks, у MS по аналогии есть Books Online, которая почти целиком дублируется в MSDN, ну а сотальных сам ищи в Google.

P.S: а вообще это всё в разделе Perfomance & Tuning смотреть надо.