![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как сохранить результаты запроса в переменных? [D7, MSSQL]
Bless © (2003-12-05 15:38:00)
Есть запрос приблизительно следующего вида:
SELECT SUM(a), SUM(b) FROM ...
Если бы запрос возвращал одно значение, можно было бы сделать
SET @x=(SELECT SUM(a) FROM...).
А если мне надо оба возвращенных значения сохранить в двух переменных?
То есть что-то вроде SELECT @x=SUM(a), @y=SUM(b) FROM ...
Это возможно как-то сделать?
Shirson (2003-12-08 10:38:00) [1]
>Stas © (08.12.03 10:34) [30]
>Set @x=(SELECT SUM(a) FROM ...)
>Set @y=(SELECT SUM(b) FROM ...)
Еще хуже. Добавляется два шага:Constant ScanиNested Loop/Inner Joinна каждый запрос
Stas (2003-12-08 10:34:00) [2]
Set @x=(SELECT SUM(a) FROM ...)
Set @y=(SELECT SUM(b) FROM ...)
Ega23 (2003-12-08 10:29:00) [3]
Да это вообще дело темное. Взять хотя-бы MSSQL-ную оптимизацию запроса:
Selecty2
T1.Value1, T1.Value2,
T2.Value1, T2.Value2,
T3.Value1, T3.Value2
From Table1 T1, Table2 T2, Table3 T3
Where
T1.Key1=T2.Key1 and T2.Key2=T3.Ke
Вот какое условие надо ставить первым:
T1.Key1=T2.Key1 илиT2.Key2=T3.Key2?
Вроде как серваку без разницы - он сам его соптимизирует. Но с точки зрения логики разница есть.
Shirson (2003-12-08 10:19:00) [4]
не @y=(select sum(b) from tab1), а @x=(select sum(a) from tab1)
Ачепятался.
Shirson (2003-12-08 10:17:00) [5]
Я брал из таблицы с 10343215 записей.
Потом решил еще и статистику посмотреть. Взял таблицу поменьше (26670 записей)
Тут дела забавные.
Подряд прогнал одну и туже связку есколько раз.
В Execution Plan на каждый запрос cost остался прежним.
А вот со статистикой чёрт знает что.
Три параметра - Продолжительность, Занятость CPU и Количество чтений устроили такую круговоеть...
Один из результатов показал, что
@y=(select sum(b) from tab1) занимает в два раза больше времени чем @y=(select sum(b) from tab1). Потом они равны, потом наоборот. И так далее.
Запрос не менялся. Таблица, вроде тоже.
Вот и пойми теперь, что подразумевается под cost в Execution Plan
Ega23 (2003-12-08 10:09:00) [6]
> Неважно.
> Поставил такие условия, что время распределилось
> 41.63
> 16.74
> 41.63
> соответственно.
>
> При любом раскладе, единичный table scan быстрее двойного.
Всё может быть. Может в таблице всего 100 записей - тогда и спор бепредметный. А бывает, что запрос с тремя вложенными курсорами, да ещё с GROUP BY и ещё с чем-нить. Вот тогда и начинаешь оптимизировать
Ega23 (2003-12-08 10:06:00) [7]
> Shirson © (08.12.03 09:59) [22]
> Ega23
> Получается следующее:
> select
> (
> @x=(select sum(a) from tab1),
> @y=(select sum(b) from tab1)
> )
> from Tab1
> Зачем такая вложенность?
>
> Не получается :)
А зачем последний FROM?
Shirson (2003-12-08 10:04:00) [8]
Неважно.
Поставил такие условия, что время распределилось
41.63
16.74
41.63
соответственно.
При любом раскладе, единичный table scan быстрее двойного.
Ega23 (2003-12-08 10:01:00) [9]
> Shirson © (08.12.03 09:54) [20]
Ага, а если a и b не поля, а функции? А если Sum идет не из одной таблицы?
ИМХО, смотреть по ситауции надо.
Лучше сорок раз по разу, чем один раз сорок раз! :-)
Shirson (2003-12-08 09:59:00) [10]
Ega23
Получается следующее:
select
(
@x=(select sum(a) from tab1),
@y=(select sum(b) from tab1)
)
from Tab1
Зачем такая вложенность?
Не получается :)
Ega23 (2003-12-08 09:54:00) [11]
> FROM tab1.
> Там же написино. tab1 - таблица. Не понимаю, что не так.
>
> Я ведь привел цитату из хелпа:
> expression={...|(scalar_subquery)|...}
> То бишь, expression может быть запросом, возвращающим единственное
> значение.
> В моем примере expression=(select sum(a) from tab1)
Получается следующее:
select
(
@x=(select sum(a) from tab1),
@y=(select sum(b) from tab1)
)
from Tab1
Зачем такая вложенность?
>А вот за это спасибо. Никогда бы не подумал. Интересно, если так. Хотя, слова "потому что" были бы очень кстати.
Да просто смотреть надо: сколько записей в таблице, какие индексы, что за типы a и b. Короче, ты попробуй и так и так и засеки время выполнения.
Shirson (2003-12-08 09:54:00) [12]
(точнее, 98% времени заняло TableScan, который делается перед каждым select)
Shirson (2003-12-08 09:44:00) [13]
Ega23 (05.12.03 18:09) [17]
Да и вообще Sum это аггрегатная функция. Бывает, что быстрее будет работать не
SELECT @x=sum(a),@y=sum(b) FROM table1,
а
SELECT @x=sum(a) FROM table1
SELECT @y=sum(b) FROM table1
Хмм.... Заподозрил неладное (с какого это перепугу, два раздельныхselect, самых временноёмких операции, будут работать быстрее чем одна?)
Взял все три запроса и прогнал в аналайзере, с включенным Execution Plan.
Времязатраты расспределились между запросами так:
SELECT @x=sum(a) FROM table1 - 33%
SELECT @y=sum(b) FROM table1 - 33%
SELECT @x=sum(a),@y=sum(b) FROM table1 - 33%
Соответственно, самselectзанял 98% времени, агрегатка - 2% времени у каждого.
Отсюда можно сделать вывод, что выбор двух сумм разом в два раза быстрее, чем выбор их по отдельности. Т.е. с точностью до наоборот, от того что ты сказал :)
Bless (2003-12-08 09:28:00) [14]
>SELECT @x=sum(a),@y=sum(b) FROM table1Здесь безусловно
>expression
>для @x это Sum(a), а для @y - Sum(b).
Если так, то где в синтаксисе
"SELECT {@local_variable = expression } [,...n]"
место для слов "FROM table1"?
>А что дальше? Первый Select к чему относится? From что?
FROM tab1.
Там же написино. tab1 - таблица. Не понимаю, что не так.
Я ведь привел цитату из хелпа:
expression={...|(scalar_subquery)|...}
То бишь, expression может быть запросом, возвращающим единственное значение.
В моем примере expression=(select sum(a) from tab1)
>Да и вообще Sum это аггрегатная функция. Бывает, что быстрее
>будет работать не
>SELECT @x=sum(a),@y=sum(b) FROM table1,
>а
>SELECT @x=sum(a) FROM table1
>SELECT @y=sum(b) FROM table1
А вот за это спасибо. Никогда бы не подумал. Интересно, если так. Хотя, слова "потому что" были бы очень кстати.
Ega23 (2003-12-05 18:09:00) [15]
ЗАРРАЗА, ОПЯТЬ НЕ ТУ КНОПКУ НАЖАЛ!!!
> Bless (05.12.03 17:50) [15]
Не, ты не понял. Вот смотри:
SELECT @x=sum(a),@y=sum(b) FROM table1Здесь безусловно expression для @x это Sum(a), а для @y - Sum(b).
Но ты написал:
select
@x=(select sum(a) from tab1),
@y=(select sum(b) from tab1)
А что дальше? Первый Select к чему относится? From что?
Да и вообще Sum это аггрегатная функция. Бывает, что быстрее будет работать не
SELECT @x=sum(a),@y=sum(b) FROM table1,
а
SELECT @x=sum(a) FROM table1
SELECT @y=sum(b) FROM table1
Ega23 (2003-12-05 18:06:00) [16]
> Bless (05.12.03 17:50) [15]
Не, ты не понял. Вот смотри:
SELECT @x=sum(a),@y=sum(b) FROM table1
Здесь безусловно expression для @x это Sum(a), а для @y - Sum(b).
Но ты написал:
select @x=(select sum(a) from tab1), @y=(select sum(b) from tab1)
Bless (2003-12-05 17:50:00) [17]
>фигня какая-то...
Почему фигня? Как раз согласно предложенному там синтаксису.
expression={...|(scalar_subquery)|...}
>Там вот что в самом начале стоит:
>SELECT {@local_variable = expression } [,...n]
Ну тогда покажи мне, что в запросе
SELECT @x=sum(a),@y=sum(b) FROM table1
является expression?
Ega23 (2003-12-05 17:25:00) [18]
Промазал, сорри....
А это:
select @x=(select sum(a) from tab1), @y=(select sum(b) from tab1)
фигня какая-то...
Ega23 (2003-12-05 17:24:00) [19]
А это select @x=(select sum(a) from tab1), @y=(select sum(b) from tab1)
Ega23 (2003-12-05 17:23:00) [20]
Там вот что в самом начале стоит:
SELECT {@local_variable = expression } [,...n]