Eu estava lendo isso e fiz o seguinte:
go
create table fiirst (
col1 int,
col2 int
);
create table seecond(
col1 int,
col2 int
);
with
n1(c) as (select 0 union all select 0 ),
n2(c) as ( select 0 from n1 as t1 cross join n1 as t2),
n3(c) as ( select 0 from n2 as t1 cross join n2 as t2),
n4(c) as (select 0 from n3 as t1 cross join n3 as t2),
ids(id) as (select ROW_NUMBER() over (order by (select null)) from n4)
insert into fiirst(col1,col2)
select id,id
from ids;
with
n1(c) as (select 0 union all select 0 ),
n2(c) as ( select 0 from n1 as t1 cross join n1 as t2),
n3(c) as ( select 0 from n2 as t1 cross join n2 as t2),
n4(c) as (select 0 from n3 as t1 cross join n3 as t2),
ids(id) as (select ROW_NUMBER() over (order by (select null)) from n4)
insert into seecond(col1,col2)
select id,id
from ids;
----Craig Freedman's query
select *
from fiirst
where fiirst.col1 > (
select min(seecond.col1)
from seecond
where seecond.col2 < fiirst.col2
);
E eu obtive um spool de índice , mesmo a tabela sendo um heap. A questão é: como isso aconteceu? Por que eu obtenho um spool de índice em um heap? No exemplo mencionado no link acima, não havia linhas, então não havia spools, mas aqui eu os vejo?
Um spool de índice ansioso é o SQL Server criando um índice durante a execução de uma consulta. Geralmente, é um sinal de que a tabela no lado interno de uma junção de loops aninhados não possui um índice útil, embora às vezes seja um erro do otimizador e possa ser corrigido com uma
FORCESEEK
HINT.Acho que sua confusão está no fato de a tabela ser um heap (não ter índices) e não ver um spool de tabela, ou pensar que o tipo de spool indica o formato da fonte de dados para o spool.
Os spools não definem o formato da fonte de dados para o spool, mas sim o formato dos dados quando eles chegam ao seu destino no spool.
Da mesma forma, dados de um índice clusterizado ou não clusterizado podem acabar em um spool de tabela. Uma grande desfeita!
Se você observar a dica de ferramenta para o spool de índice ansioso, verá a definição básica do índice que substituiria a necessidade de um spool no plano, embora não seja muito difícil descobrir apenas olhando a consulta em si.
No seu caso, o otimizador não tem escolha a não ser usar uma junção de Nested Loops porque sua correlação interna não tem predicado de igualdade:
Para usar uma junção Hash ou Merge, pelo menos um predicado de igualdade é necessário.