Це суто академічне запитання, настільки, що це не викликає проблем, і мені просто цікаво почути якісь пояснення поведінки.
Візьміть стандартний випуск Іцзіка Бен-Гана, приєднавшись до таблиці CTE, виходячи з:
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
Задайте запит, який створить таблицю номерів рядків на 1 мільйон:
SELECT
COUNT(N)
FROM
dbo.TallyTable(1000000) tt
Погляньте на паралельний план виконання цього запиту:

Зверніть увагу, що "фактичний" ряд рядків до оператора збирання потоків становить 1,004,588. Після оператора збирання потоків кількість рядків очікується 1 000 000. Тим не менш, значення не відповідає і змінюватиметься від запуску до запуску. Результат COUNT завжди правильний.
Повторіть запит, змушуючи паралельний план:
SELECT
COUNT(N)
FROM
dbo.TallyTable(1000000) tt
OPTION (MAXDOP 1)
Цього разу всі оператори показують правильні "фактичні" числа рядків.

Я пробував це на 2005SP3 та 2008R2 до цих пір, однакові результати для обох. Будь-які думки щодо того, що може спричинити це?
