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

SQL во всех проявлениях - от ANSI-92 до TSQL.

Модераторы: Yurich, Absurd

Ответить
Mihail
Сообщения: 1
Зарегистрирован: 05 июн 2004, 14:04

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

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

но для этого запрос нужно вызывать из текстовой переменной, заменяя функции конкретным выражением
Жду ответа от всех кто знает как это сделать или может предложить другой метод ускорить выполнение запроса
Аватара пользователя
AiK
Сообщения: 2287
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

Mihail, вообще-то стандартная процедура оптимизации запроса начинается с изучения плана этого запроса. Из него будет видно, где именно твой запрос просаживается. Из практики где-то в 90% случаев где-нибудь идёт сканирование таблицы, т.е. индекса не хватает.
Даже самый дурацкий замысел можно воплотить мастерски
alexx
Сообщения: 116
Зарегистрирован: 02 июл 2004, 22:29
Откуда: Hamburg

Mihail, не знаю какой у вас сервер. Но скорее всего надо ставить индексы на Fr_funk_scalar (@k1,@k2,@K3) и другие. Потом изучение плана чтоб избежать сканирование таблицы.
-------------
Лень - двигатель прогресса!
Аватара пользователя
Oscar
Сообщения: 963
Зарегистрирован: 29 май 2004, 13:44
Откуда: Мюнхен (рожден в Киеве)
Контактная информация:

А можно для необразованных пояснить, что такое "изучение плана запроса" ?
Аватара пользователя
AiK
Сообщения: 2287
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

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
Разница - в использовании индекса.
Даже самый дурацкий замысел можно воплотить мастерски
Аватара пользователя
Oscar
Сообщения: 963
Зарегистрирован: 29 май 2004, 13:44
Откуда: Мюнхен (рожден в Киеве)
Контактная информация:

AiK, спасибо!
А ещё, если будешь столь любезным, можешь сказать о каком сервере идёт речь? Или эти планы общие для всех СУБД?
Скажи в каком мануале глянуть, плиз, для общего развития ..
Аватара пользователя
AiK
Сообщения: 2287
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

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

P.S: а вообще это всё в разделе Perfomance & Tuning смотреть надо.
Даже самый дурацкий замысел можно воплотить мастерски
Ответить