Il codice di esempio in questo elemento di connessione
Mostra un bug dove
SELECT COUNT(*)
FROM dbo.my_splitter_1('2') L1
INNER JOIN dbo.my_splitter_1('') L2
ON L1.csv_item = L2.csv_item
Restituisce i risultati corretti. Ma quanto segue restituisce risultati errati (nel 2014 utilizzando il nuovo stimatore della cardinalità)
SELECT
(SELECT COUNT(*)
FROM dbo.my_splitter_1('2') L1
INNER JOIN dbo.my_splitter_1('') L2
ON L1.csv_item = L2.csv_item)
Poiché carica erroneamente i risultati per L2 in uno spool di sottoespressione comune, quindi riproduce il risultato per quello L1.
Ero curioso di sapere perché la differenza di comportamento tra le due query. Trace Flag 8675 mostra che entra in funzione quello che funziona search(0) - transaction processing
e quello che non funziona search(1) - quick plan
.
Quindi presumo che la disponibilità di ulteriori regole di trasformazione sia alla base della differenza di comportamento (la disabilitazione di BuildGbApply o GenGbApplySimple sembra risolverla, ad esempio).
Ma perché i due piani per queste query molto simili incontrano diverse fasi di ottimizzazione? Da quello che ho letto search (0)
richiede almeno tre tabelle e quella condizione certamente non è soddisfatta nel primo esempio.