![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Время выполнения процедуры [D6, MSSQL]
wild_arg © (2004-04-05 15:44:00)Народ может кто сталкивался?
Написал SQL-код процедуры в Query Analyzer. Все отдладил. Параметры процедуры задал переменными. Все выполняется 12 сек.
Делаю такую процедуру, запускаю ее - она выполняется больше минуты.
В коде ничего не менял - почему такая разница во времени выполнения
ZrenBy (2004-04-05 16:54:00) [1]Можно указать принудительное сканирование таблицы с помощью
WITH(INDEX=0)
wild_arg (2004-04-05 16:48:00) [2]это все тут
http://www.osp.ru/win2000/sql/dialogs/311_1_print.htm
wild_arg (2004-04-05 16:43:00) [3]Народ, решил проблему! :)
Оказалось, я где-то нашел такую хрень, по разному план выполнения строится:
привожу как понял. рассмотрим два примера:
1.
declare @date datetime
set @date = '2004-03-01'
select * from Заявки where date>=@date
2.
select * from Заявки where date>='2004-03-01'
если у нас по полю Dateпостроен индекс, то он будет задействован только во втором случае. в первом, как написано было, оптимизатор не знает чего мы там будем искать и индексом не пользуется.
Вот такая хрень.
Оформим этот код в процедуру:
create procedure Proc
@date datetime
as
select * from Заявки where date>=@date
Когда мы вызовем ее в анализаторе:Exec Proc '2004-03-01', то оптимизатор на входе после замены в тексте параметров на значения, получит код приведенный в примере 2 и при оптимизации воспользуется индексом.
А у меня в задаче кривые индексы (ну база не моя, убивать я их не стал). И вот какая хрень вышла, что написав код наподобе примера 1., оптимизатор не юзает индекс и выполняет запрос быстрее, а оформляем процедуру и все, хана, пошла работа над индексом. НО! :) я обманул его, написал процедуру таким образом:
create procedure Proc
@_date datetime
as
declare @date datetime
set @date = @_date
select * from Заявки where date>=@date
и оптимизатор, получает код похожий на пример 1. и индекс не юзает :)
Но, наверное, можно просто как-то отключить использование индексов? Типаset useindex offили что-то в этом роде. Не знаете как?
Ega23 (2004-04-05 16:35:00) [4]А, в этом смысле...
sniknik (2004-04-05 16:34:00) [5]у него серверный курсор стоит, данные(первые) показываются сразу после выполнения запроса дальше фетчатся в бакграунде до конца выборки.
у тебя (при клиентском курсоре) ждет самого последнего байта выборки(запрос+передача) а после отображается.
Ega23 (2004-04-05 16:25:00) [6]прикол может быть в том, что в QA данные до конца не фетчаться
фетч может много времени занять
Это в смысле?
Desdechado (2004-04-05 15:54:00) [7]прикол может быть в том, что в QA данные до конца не фетчаться
фетч может много времени занять
Ega23 (2004-04-05 15:50:00) [8]Делаю такую процедуру, запускаю ее - она выполняется больше минуты.
А как ты до этого её запускал? Из QA? Когда 12 секунд выполнялось?