Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.01.05;
Скачать: CL | DM;

Вниз

Как сохранить результаты запроса в переменных?   Найти похожие ветки 

 
Bless   (2003-12-05 15:38) [0]

Есть запрос приблизительно следующего вида:
SELECT SUM(a), SUM(b) FROM ...
Если бы запрос возвращал одно значение, можно было бы сделать
SET @x=(SELECT SUM(a) FROM...).
А если мне надо оба возвращенных значения сохранить в двух переменных?
То есть что-то вроде SELECT @x=SUM(a), @y=SUM(b) FROM ...
Это возможно как-то сделать?


 
Плохиш_   (2003-12-05 15:49) [1]

SELECT SUM(a) as x, SUM(b) as y FROM ...

не помогло?


 
Anatoly Podgoretsky ©   (2003-12-05 15:50) [2]

Fields[0], Fields[1], ...


 
Bless   (2003-12-05 16:29) [3]

>не помогло?

А должно было?
Ведь в твоей предложении x, y - просто имена столбцов в результирующеь запросе. А мне надо именно в переменных все сохранить, чтобы потом с ними дальше работать.

>Fields[0], Fields[1], ..

Мне надо не в Делфи, а в хп


 
Bless   (2003-12-05 16:29) [4]

>не помогло?

А должно было?
Ведь в твоей предложении x, y - просто имена столбцов в результирующеь запросе. А мне надо именно в переменных все сохранить, чтобы потом с ними дальше работать.

>Fields[0], Fields[1], ..

Мне надо не в Делфи, а в хп


 
Ega23   (2003-12-05 16:37) [5]

Declare @X int, @Y int
Set NoCount ON

Select @X=SUM(a) FROM...
Select @Y=SUM(b) FROM...

-- Здесь делаешь что хошь с @X, @Y

Set NoCount OFF

Select X=@X, Y=@Y

Return(0)


 
Silver Alex ©   (2003-12-05 16:38) [6]

declare x numeric(18,4)
declare y numeric(18,4)

SELECT x=SUM(a), y=SUM(b) FROM ...

это в MS SQL


 
Silver Alex ©   (2003-12-05 16:39) [7]


> Silver Alex © (05.12.03 16:38) [6]

конечно везде @x, @y


 
Bless   (2003-12-05 16:55) [8]

> Silver Alex ©

Вот блин. А было SELECT x=SUM(a) AS st, y=SUM(b) FROM ...
и не работало! Все из-за AS.
Спасибо.

P.S. А как вы делаете текст наклонным? А то у меня как-то один раз получилось и больше никак. Это от броузера не зависит?


 
Bless   (2003-12-05 17:02) [9]

Кстати, эта возможность (SELECT @X=sum(), @y=sum...)никак не отображена в BOL или я так плохо смотрел? Если плохо смотрел, ткните носом, плз.


 
Ega23   (2003-12-05 17:13) [10]

SELECT @local_variable (T-SQL)

Самое первое в Указателе на Select стоит


 
Bless   (2003-12-05 17:19) [11]

Это не то, насколько я понимаю.
Там эта возможнось не описана. Там только такая:
select @x=(select sum(a) from tab1), @y=(select sum(b) from tab1)


 
Ega23   (2003-12-05 17:23) [12]

Там вот что в самом начале стоит:
SELECT {@local_variable = expression } [,...n]


 
Ega23   (2003-12-05 17:24) [13]

А это select @x=(select sum(a) from tab1), @y=(select sum(b) from tab1)


 
Ega23   (2003-12-05 17:25) [14]

Промазал, сорри....

А это:
select @x=(select sum(a) from tab1), @y=(select sum(b) from tab1)
фигня какая-то...


 
Bless   (2003-12-05 17:50) [15]

>фигня какая-то...

Почему фигня? Как раз согласно предложенному там синтаксису.
expression={...|(scalar_subquery)|...}

>Там вот что в самом начале стоит:
>SELECT {@local_variable = expression } [,...n]

Ну тогда покажи мне, что в запросе

SELECT @x=sum(a),@y=sum(b) FROM table1

является expression?


 
Ega23   (2003-12-05 18:06) [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)


 
Ega23   (2003-12-05 18:09) [17]

ЗАРРАЗА, ОПЯТЬ НЕ ТУ КНОПКУ НАЖАЛ!!!

> 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


 
Bless   (2003-12-08 09:28) [18]

>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

А вот за это спасибо. Никогда бы не подумал. Интересно, если так. Хотя, слова "потому что" были бы очень кстати.


 
Shirson ©   (2003-12-08 09:44) [19]

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% времени у каждого.

Отсюда можно сделать вывод, что выбор двух сумм разом в два раза быстрее, чем выбор их по отдельности. Т.е. с точностью до наоборот, от того что ты сказал :)


 
Shirson ©   (2003-12-08 09:54) [20]

(точнее, 98% времени заняло TableScan, который делается перед каждым select)


 
Ega23   (2003-12-08 09:54) [21]


> 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:59) [22]

Ega23
Получается следующее:
select
(
@x=(select sum(a) from tab1),
@y=(select sum(b) from tab1)
)
from Tab1
Зачем такая вложенность?


Не получается :)


 
Ega23   (2003-12-08 10:01) [23]


> Shirson © (08.12.03 09:54) [20]

Ага, а если a и b не поля, а функции? А если Sum идет не из одной таблицы?
ИМХО, смотреть по ситауции надо.
Лучше сорок раз по разу, чем один раз сорок раз! :-)


 
Shirson ©   (2003-12-08 10:04) [24]

Неважно.
Поставил такие условия, что время распределилось
41.63
16.74
41.63
соответственно.

При любом раскладе, единичный table scan быстрее двойного.


 
Ega23   (2003-12-08 10:06) [25]


> Shirson © (08.12.03 09:59) [22]
> Ega23
> Получается следующее:
> select
> (
> @x=(select sum(a) from tab1),
> @y=(select sum(b) from tab1)
> )
> from Tab1
> Зачем такая вложенность?
>
> Не получается :)

А зачем последний FROM?


 
Ega23   (2003-12-08 10:09) [26]


> Неважно.
> Поставил такие условия, что время распределилось
> 41.63
> 16.74
> 41.63
> соответственно.
>
> При любом раскладе, единичный table scan быстрее двойного.


Всё может быть. Может в таблице всего 100 записей - тогда и спор бепредметный. А бывает, что запрос с тремя вложенными курсорами, да ещё с GROUP BY и ещё с чем-нить. Вот тогда и начинаешь оптимизировать


 
Shirson ©   (2003-12-08 10:17) [27]

Я брал из таблицы с 10343215 записей.

Потом решил еще и статистику посмотреть. Взял таблицу поменьше (26670 записей)

Тут дела забавные.
Подряд прогнал одну и туже связку есколько раз.
В Execution Plan на каждый запрос cost остался прежним.
А вот со статистикой чёрт знает что.
Три параметра - Продолжительность, Занятость CPU и Количество чтений устроили такую круговоеть...
Один из результатов показал, что
@y=(select sum(b) from tab1) занимает в два раза больше времени чем @y=(select sum(b) from tab1). Потом они равны, потом наоборот. И так далее.
Запрос не менялся. Таблица, вроде тоже.
Вот и пойми теперь, что подразумевается под cost в Execution Plan


 
Shirson ©   (2003-12-08 10:19) [28]

не @y=(select sum(b) from tab1), а @x=(select sum(a) from tab1)
Ачепятался.


 
Ega23   (2003-12-08 10:29) [29]

Да это вообще дело темное. Взять хотя-бы MSSQL-ную оптимизацию запроса:
Select
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
y2

Вот какое условие надо ставить первым:
T1.Key1=T2.Key1 или T2.Key2=T3.Key2 ?
Вроде как серваку без разницы - он сам его соптимизирует. Но с точки зрения логики разница есть.


 
Stas ©   (2003-12-08 10:34) [30]

Set @x=(SELECT SUM(a) FROM ...)
Set @y=(SELECT SUM(b) FROM ...)


 
Shirson ©   (2003-12-08 10:38) [31]

>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 на каждый запрос



Страницы: 1 вся ветка

Текущий архив: 2004.01.05;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.041 c
6-12014
Elisa
2003-10-31 12:13
2004.01.05
отправка сообщения с почтового ящика


3-11840
Вольный Стрелок
2003-12-09 18:06
2004.01.05
Сравнение ADO и dbExpress


1-11907
NneRreaLl
2003-12-21 19:03
2004.01.05
Работа с файлами, строками


1-11923
Alexious
2003-12-17 23:34
2004.01.05
Парсер


1-11868
Tester
2003-12-18 16:13
2004.01.05
О производительности