Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Вопрос к SomewhereSomehow по плану выполнения  [new]
Любопытный гость
Guest
if object_id('tempdb..#table') is not null drop table #table
create table #table(grp varchar(20), value float)

insert #table values ('a', 100)
insert #table values ('a', 100)
insert #table values ('b', 101)
insert #table values ('b', 101)

select *, sum(value) over (partition by grp) from #table
sum over реализуется через table spool.
По моему разумению это какая-то специальная форма спула.
Так ли это? Можно это увидеть в плане? Где можно почитать про спецспулы?

Спасибо.
22 дек 16, 13:46    [20036505]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос к SomewhereSomehow по плану выполнения  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
Любопытный гость,

Здравствуйте,

Этот спул называется Common Subexpression Spool, его подвид Segment Spool. Про то как он работает много кто писал (гуглите соответвенно по словам "sql server common subexpression spoo" или "sql server segment spool"), но я предпочитаю первоисточник в виде статьи Крейга Фридмана: https://blogs.msdn.microsoft.com/craigfr/2008/03/31/ranking-functions-rank-dense_rank-and-ntile/

Специальной пометки о том какой это вид спула в плане нет, просто не такого свойства. Косвенно вы это можете понять по специфической форме плана, когда в одном месте спул заполняется а в других местах плана из него читается, при этом операторы, которые читают, имеют свойство Primary Node ID, в котором указан ID узла плана самого первого спула (я говорил об этом виде спула в докладе на SQL Saturday Краснодар, жаль записи не велось, а то так бы ссылку дал).

Кстати, начиная с 2016 сервера эту операцию может реализовать не только такой план, появился новый оператор Windows Aggregate, предназначенный для работы в режиме Batch.
Ваш пример, слегка модифицированный, даст такой план:
if object_id('tempdb..#table') is not null drop table #table
create table #table(grp varchar(20), value float)

insert #table values ('a', 100)
insert #table values ('a', 100)
insert #table values ('b', 101)
insert #table values ('b', 101)

create nonclustered index ix_grp on #table(grp) include (value);
create nonclustered columnstore index ncsi on #table(grp) where value < 0;

select *, sum(value) over (partition by grp) from #table;

Картинка с другого сайта.

Подробнее про Window Aggregate, если интересно, можно у Ицика Бен-Гана почитать: http://sqlmag.com/sql-server/what-you-need-know-about-batch-mode-window-aggregate-operator-sql-server-2016-part-1
22 дек 16, 14:31    [20036790]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос к SomewhereSomehow по плану выполнения  [new]
Любопытный гость
Guest
SomewhereSomehow,

Спасибо!
22 дек 16, 14:56    [20036918]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить