Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как сохранить результаты запроса в переменных? [D7, MSSQL]


Страницы:   1 2

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-ную оптимизацию запроса:
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?
Вроде как серваку без разницы - он сам его соптимизирует. Но с точки зрения логики разница есть.


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]


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо