Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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
3-1095156701
Chery
2004-09-14 14:11
2004.10.10
Базу в Access перевожу на MySQL, Midas


3-1095146824
chis
2004-09-14 11:27
2004.10.10
Как открыть TADODataSet не полностью?


3-1095044872
tERRORist
2004-09-13 07:07
2004.10.10
Как остановить выполнение запроса в ADO


1-1096159405
Leaner
2004-09-26 04:43
2004.10.10
Ошибка: C0000008 в строке CloseHandle(FHand);


14-1094813897
STM
2004-09-10 14:58
2004.10.10
Как написать mailer