El código de ejemplo en este elemento de conexión
Muestra un error donde
SELECT COUNT(*)
FROM dbo.my_splitter_1('2') L1
INNER JOIN dbo.my_splitter_1('') L2
ON L1.csv_item = L2.csv_item
Devuelve los resultados correctos. Pero lo siguiente devuelve resultados incorrectos (en 2014 usando el nuevo Estimador de cardinalidad)
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 carga incorrectamente los resultados para L2 en un carrete de subexpresión común, luego reproduce el resultado de eso para el resultado L1.
Tenía curiosidad sobre por qué la diferencia de comportamiento entre las dos consultas. La marca de seguimiento 8675 muestra que entra el que funciona search(0) - transaction processing
y el que falla search(1) - quick plan
.
Por lo tanto, supongo que la disponibilidad de reglas de transformación adicionales está detrás de la diferencia de comportamiento (deshabilitar BuildGbApply o GenGbApplySimple parece solucionarlo, por ejemplo).
Pero, ¿por qué los dos planes para estas consultas muy similares encuentran diferentes fases de optimización? Por lo que he leído, se search (0)
requieren al menos tres tablas y esa condición ciertamente no se cumple en el primer ejemplo.
fuente