Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Physical/Logical operator: Window Spool / Stream Aggregate  [new]
window spool
Guest
Привет, котаны!

Такие пирожки. Читаю про Window Spool, который появляется при использовании aggregate window функций в запросах. Сказано что он формирует колонку WindowCountXXXX, потом Stream Aggregate группирует это все по WindowCountXXX. Не пойму, что записуется в эту колонку.
31 май 13, 13:33    [14375547]     Ответить | Цитировать Сообщить модератору
 Re: Physical/Logical operator: Window Spool / Stream Aggregate  [new]
window spool
Guest
window spool,

пофиксено
который появляется при использовании aggregate window функций с определением frame.


Написано что для каждой строки он помечает фрейм в которую он входит. Как он это делает?
31 май 13, 13:39    [14375591]     Ответить | Цитировать Сообщить модератору
 Re: Physical/Logical operator: Window Spool / Stream Aggregate  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
window spool,

У меня есть несколько уточняющих вопросов.
- Кто такие котаны? Могут ли отвечать те, кто не котаны, или не знают что они котаны?
- Какие пирожки? С чем?
- Что значит "Как он это делает?" Вас интересует программный код, классы, методы сиквела? Потому что логика, вроде, объяснена в самом вашем вопросе, и, видимо, там, где вы это прочитали. Какие детали вас интересуют и почему?
31 май 13, 19:05    [14377470]     Ответить | Цитировать Сообщить модератору
 Re: Physical/Logical operator: Window Spool / Stream Aggregate  [new]
window spool
Guest
SomewhereSomehow
window spool,

У меня есть несколько уточняющих вопросов.
- Кто такие котаны? Могут ли отвечать те, кто не котаны, или не знают что они котаны?


конечно могут

- Какие пирожки? С чем?


с вареньем

- Что значит "Как он это делает?" Вас интересует программный код, классы, методы сиквела? Потому что логика, вроде, объяснена в самом вашем вопросе, и, видимо, там, где вы это прочитали. Какие детали вас интересуют и почему?


Мне не ясно как этот оператор работает. Рытьем интернетов, нашел по крупицам, что на вход поступают строки от предыдущего оператора и в зависимости от условий Window Spool создает work table или в памяти (когда фрейм задан как ROWS и число строк на входе <=10000) или в tempdb, (если фрейм задан как RANGE или число строк > 10000). Так же сказано, что Window Spool и Stream Aggregate (потребитель данных от Window Spool) это один и тот же оператор просто при визуализации плана для удобства они делятся на два разных. Я не нашел в каком виде этот Window Spool подает строки для Stream Aggregate.

Судя по крупицам описания, получается, что для каждой входной Window Spool'ом создается подмножество строк удовлетворяющих фрейму. Т. е. в Window Spool содержатся все возможные фреймы? Но все эти копии строк хранятся одним скопом во временной таблице и у них добавлена колонка WindowCountXXX? а Stream Aggregate делает группировку по колонке? Это так в общем случае или нет?

Также читал про оптимизации, например, когда нижняя граница фрейма UNBOUNDED PRECEDING. В этом случае в спул насколько я понял попадает только нарастающий итог для каждой строки и сама строка и никаких фреймов не сохраняется. Типа оптимизации. Т. е. например для запросаю
[sql]
select
actid, tranid, val,
sum(val) over(partition by actid order by tranid rows between unbounded preceding and current row) as balance
from dbo.transactions;
[/sql]

План как на картинке, только вот почему на выходе 4000000 строк вместо 2000000. Сохраняются пары строк разной структуры? Парами строка и отдельной строкой нарастающий итог?

Не понимаю почему так куцо все описано в BOL по опереторам планов :(. В книжках и статьях тоже маловато пишут о некоторых операторах. Нужно мне это для понимания что в плане происходит. Для оптимизаци и например.
31 май 13, 22:27    [14377932]     Ответить | Цитировать Сообщить модератору
 Re: Physical/Logical operator: Window Spool / Stream Aggregate  [new]
window spool
Guest
window spool,

Картинка с другого сайта.
31 май 13, 22:41    [14377953]     Ответить | Цитировать Сообщить модератору
 Re: Physical/Logical operator: Window Spool / Stream Aggregate  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
window spool
Мне не ясно как этот оператор работает. Рытьем интернетов, нашел по крупицам, что на вход поступают строки от предыдущего оператора и в зависимости от условий Window Spool создает work table или в памяти (когда фрейм задан как ROWS и число строк на входе <=10000) или в tempdb, (если фрейм задан как RANGE или число строк > 10000). Так же сказано, что Window Spool и Stream Aggregate (потребитель данных от Window Spool) это один и тот же оператор просто при визуализации плана для удобства они делятся на два разных. Я не нашел в каком виде этот Window Spool подает строки для Stream Aggregate.

Судя по крупицам описания, получается, что для каждой входной Window Spool'ом создается подмножество строк удовлетворяющих фрейму. Т. е. в Window Spool содержатся все возможные фреймы? Но все эти копии строк хранятся одним скопом во временной таблице и у них добавлена колонка WindowCountXXX? а Stream Aggregate делает группировку по колонке? Это так в общем случае или нет?

Также читал про оптимизации, например, когда нижняя граница фрейма UNBOUNDED PRECEDING. В этом случае в спул насколько я понял попадает только нарастающий итог для каждой строки и сама строка и никаких фреймов не сохраняется. Типа оптимизации. Т. е. например для запросаю
select
	actid, tranid, val,
	sum(val) over(partition by actid order by tranid rows between unbounded preceding and current row) as balance
from dbo.transactions;


План как на картинке, только вот почему на выходе 4000000 строк вместо 2000000. Сохраняются пары строк разной структуры? Парами строка и отдельной строкой нарастающий итог?

Не понимаю почему так куцо все описано в BOL по опереторам планов :(. В книжках и статьях тоже маловато пишут о некоторых операторах. Нужно мне это для понимания что в плане происходит. Для оптимизаци и например.


Вы почти полностью описали что и как работает. Это описание можно найти в книге Itzik Ben-Gan - Microsoft® SQL Server® 2012 High-Performance T-SQL Using Window Functions.
Там вроде достаточно понятно написано.

В общем случае, в Window Spool разворачивает строчку во фрейм, помечает принадлежность к фрейму в колонке WindowCountXXX и агрегирует. Есть две оптимизации этого процесса если соблюдаются несколько условий. Не хранить все строки, а хранить для каждой строки только текущую и результат предыдущей агрегации, чтобы агрегировать всего две строки и не хранить лишнего - как раз тот самый нарастающий итог. И вторая стратегия, если агрегат кумулятивный, считать результат до верхней границы минус результат до нижней границы, тогда в плане будет видно два оператора спул.

Если вы не верите автору, что это именно так и происходит, то единственный способ проверить самому, это либо вооружиться дебаггером, либо попробовать расковырять страницы спула, чтобы посмотреть, что там. Я хотел ради любопытства в свое время, но забил. Имхо, для понимания процесса, это не нужно. Для понимания того, какой именно спул в плане, достаточно посмотреть на число строк. Для отслеживания память-диск есть xEvent, не помню точно как называется, что-то типа "window_spool_ondisk". Плюс вы сами перечислили условия когда какой спул используется, достаточно их знать, чтобы сказать используется ли спул в памяти или на диске. Мне кажется этих сведений вполне достаточно для принятия решения при анализе запроса или плана. Непонятно, какой профит, кроме удовлетворенного любопытства, может принести знание какова структура сохраняемых строк.
1 июн 13, 09:08    [14378584]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Physical/Logical operator: Window Spool / Stream Aggregate  [new]
o-o
Guest
SomewhereSomehow
- Кто такие котаны? Могут ли отвечать те, кто не котаны, или не знают что они котаны?

+ котаны

котаны -- это братаны (собратья по форуму) в виде котов.
да, имеются котаны, к-ые не знают, что они котаны.
у меня, например, собрана коллекция котанов с форума,
но как об этом узнал churupaha?

выставку организовать не получится,
как-то один пробовал уже (Незнайка), и всем его художества нравились,
пока они себя не находили, так что лучше не надо.

to churupaha: вас еще нет в моей коллекции, предлагаю такое:
Картинка с другого сайта.


ну и если вам o-o для вашей галереи, тоже есть:
Картинка с другого сайта.
23 июл 15, 00:33    [17923917]     Ответить | Цитировать Сообщить модератору
 Re: Physical/Logical operator: Window Spool / Stream Aggregate  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
o-o,

норм картинка. вот этот мульт смотрел, когда регистрировался.

+
Картинка с другого сайта.
23 июл 15, 09:17    [17924304]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить