O código de exemplo neste item de conexão
Mostra um erro em que
SELECT COUNT(*)
FROM dbo.my_splitter_1('2') L1
INNER JOIN dbo.my_splitter_1('') L2
ON L1.csv_item = L2.csv_item
Retorna os resultados corretos. Mas o seguinte retorna resultados incorretos (em 2014, usando o novo Estimador de cardinalidade)
SELECT
(SELECT COUNT(*)
FROM dbo.my_splitter_1('2') L1
INNER JOIN dbo.my_splitter_1('') L2
ON L1.csv_item = L2.csv_item)
Como ele carrega incorretamente os resultados para L2 em um spool de subexpressão comum, repete o resultado para o resultado L1.
Fiquei curioso para saber por que a diferença de comportamento entre as duas consultas. O sinalizador de rastreamento 8675 mostra que entra aquele que funciona search(0) - transaction processing
e o que falha search(1) - quick plan
.
Portanto, suponho que a disponibilidade de regras de transformação adicionais esteja por trás da diferença de comportamento (desabilitar o BuildGbApply ou GenGbApplySimple parece corrigi-lo, por exemplo).
Mas por que os dois planos para essas consultas muito semelhantes encontram diferentes fases de otimização? Pelo que li, search (0)
requer pelo menos três tabelas e essa condição certamente não é atendida no primeiro exemplo.