Esta es una pregunta puramente académica, en tanto que no está causando un problema y solo estoy interesado en escuchar cualquier explicación para el comportamiento.
Tomemos un tema estándar de la tabla de conteo CTE de unión cruzada de Itzik Ben-Gan:
USE [master]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION [dbo].[TallyTable]
(
@N INT
)
RETURNS TABLE WITH SCHEMABINDING AS
RETURN
(
WITH
E1(N) AS
(
SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL
SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL
SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1
) -- 1*10^1 or 10 rows
, E2(N) AS (SELECT 1 FROM E1 a, E1 b) -- 1*10^2 or 100 rows
, E4(N) AS (SELECT 1 FROM E2 a, E2 b) -- 1*10^4 or 10,000 rows
, E8(N) AS (SELECT 1 FROM E4 a, E4 b) -- 1*10^8 or 100,000,000 rows
SELECT TOP (@N) ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS N FROM E8
)
GO
Emita una consulta que creará una tabla de número de fila de 1 millón:
SELECT
COUNT(N)
FROM
dbo.TallyTable(1000000) tt
Eche un vistazo al plan de ejecución paralela para esta consulta:
Tenga en cuenta que el recuento de filas 'real' antes del operador de recopilación de secuencias es 1.004.588. Después del operador de recopilar flujos, el recuento de filas es el esperado de 1,000,000. Más extraño aún, el valor no es consistente y variará de una carrera a otra. El resultado de COUNT siempre es correcto.
Emita la consulta nuevamente, forzando un plan no paralelo:
SELECT
COUNT(N)
FROM
dbo.TallyTable(1000000) tt
OPTION (MAXDOP 1)
Esta vez, todos los operadores muestran los recuentos de filas 'reales' correctos.
He intentado esto en 2005SP3 y 2008R2 hasta ahora, los mismos resultados en ambos. ¿Alguna idea de lo que podría causar esto?