Текущий архив: 2004.10.10;
Скачать: CL | DM;
Вниз
Эффективность запросов Найти похожие ветки
← →
NewDelpher (2004-09-10 08:22) [0]Имеется хранимая функция F. При использовании запроса вида:
SELECT F(field1), field1, field2 FROM mytable WHERE field2 >= 10
время на его выполнение тратися в 3 раза больше, чем если предварительно запихнуть следующий запрос
SELECT field1, field2 FROM mytable WHERE field2 >= 10
в курсор, а потом "пробежав" по нему, вычислить F для каждого field1
Чем это можно объяснить? Тем что в первом случае функция вычисляется для абсолютно всех field1 из mytable, а потом только отфильтровывается WHERE field2 >= 10?
← →
NewDelpher (2004-09-10 09:54) [1]как бы обойтись без курсоров, сохранив быстродействие?
← →
stone © (2004-09-10 09:58) [2]create table #T(field1 ..., field2 ...)
insert into #T
SELECT field1, field2 FROM mytable WHERE field2 >= 10
select F(field1), field1, field2 FROM #T
← →
NewDelpher (2004-09-10 10:13) [3]stone ©
спасибо, конечно. Но разве предложенный Вами вариант не эквивалентен:
SELECT F(tmp.field1), tmp.* FROM
(SELECT field1, field2 FROM mytable WHERE field2 >= 10) tmp
Который я уже пробовал, а скорость возросла только процентов на 10%
← →
Ega23 © (2004-09-10 10:29) [4]stone © (10.09.04 09:58) [2]
create table #T(field1 ..., field2 ...)
insert into #T
Можно короче: Select into #T
← →
NewDelpher © (2004-09-10 10:41) [5]Еще заметил, что запрос SELECT F(field1), field1, field2 FROM mytable WHERE field2 in ( 10, 11, 12) выполняется гораздо медленнее, чем
три запроса вместе взятые:
SELECT F(field1), field1, field2 FROM mytable WHERE field2 = 10
SELECT F(field1), field1, field2 FROM mytable WHERE field2 = 11
SELECT F(field1), field1, field2 FROM mytable WHERE field2 = 12
← →
sniknik © (2004-09-10 11:08) [6]сабж без описания метода тестирования/подробностей смысла не имеет имхо.
например (явно в глаза бросается) тут не учитывается что, :
1 с дополнительным полем получаюшийся рекордсет имеет больший обьем и большее время на передачу.
2 неопределенная функция, время ее выполнения может различатся в зависимости от реализации.
3 опять же неопределенная функция, обьем занимаемых данных может как стать меньше так и больше.
4 неопределена работа с курсором (в нем просто функция вычисляется или формируется аналогичный первому запросу рекордсет? поле добавляется?)
5 наверняка чтото еще, версия сервера MSSQL, его сервис пак. к примеру
(в общем сабж можно переименовать в "Эффективность NewDelpher-а в MSSQL]" ;о)))
а вот в [5] похоже угадал
сравнение всегда было более быстрой операцией и с индексами лутше работало чем остальные
вот так как, быстрее?
SELECT F(field1), field1, field2 FROM mytable WHERE field2 between 10 and 12
← →
NewDelpher © (2004-09-10 11:24) [7]
> sniknik © (10.09.04 11:08) [6]
> сабж без описания метода тестирования/подробностей смысла
> не имеет имхо.
>
> например (явно в глаза бросается) тут не учитывается что,
> :
> 1 с дополнительным полем получаюшийся рекордсет имеет больший
> обьем и большее время на передачу.
> 2 неопределенная функция, время ее выполнения может различатся
> в зависимости от реализации.
> 3 опять же неопределенная функция, обьем занимаемых данных
> может как стать меньше так и больше.
> 4 неопределена работа с курсором (в нем просто функция вычисляется
> или формируется аналогичный первому запросу рекордсет? поле
> добавляется?)
> 5 наверняка чтото еще, версия сервера MSSQL, его сервис
> пак. к примеру
1. Метод тестирования - в Query Analyzer-е F5 и смотрю на затраченное время.
2, 3. Время выполнения этой функции не зависит от параметров. И еще в ней используются запросы к другим таблицам.
4. В курсор сначала копируется данные
SELECT field1, field2 FROM mytable WHERE field2 >= 10,
потом в цикле для каждого field1 вычисляется F(field1) и всё это
INSERT-ом заносится в результирующую таблицу.
← →
NewDelpher © (2004-09-10 11:27) [8]
> а вот в [5] похоже угадал
> сравнение всегда было более быстрой операцией и с индексами
> лутше работало чем остальные
значит, за счет этого и такая разница
← →
sniknik © (2004-09-10 11:42) [9]> потом в цикле для каждого field1 вычисляется F(field1) и всё это
> INSERT-ом заносится в результирующую таблицу.
с тремя полями или с двумя? типы полей? тип результата?
запрос с функцией может легко занять меньшее время чем без нее.
только нужно много данных чтобы это было правдой ;)
например
SELECT Cast(Field1 as Int) AS Field1, Field2 FROM mytable
часто будет выполнятся меньшее время чем
SELECT Field1, Field2 FROM mytable
если поле Field1 строка Char(30)например и в нее строкой забиты цифровые значения. за счет того что Char(30) больше чем INT а время напередачу больше чем на вичисление.
заметь, запрос
SELECT Cast(Field1 as Int) AS Field0, Field1, Field2 FROM mytable
(как у тебя) будет гарантираванно выполнятся дольше, т.к. к передаче данных добавится еще один "вес" и добявится время на вычисления.
> значит, за счет этого и такая разница
если бы все было так просто и однозначно...;). нет конечно, или не только изза этого.
Страницы: 1 вся ветка
Текущий архив: 2004.10.10;
Скачать: CL | DM;
Память: 0.49 MB
Время: 0.022 c