นี่เป็นคำถามเชิงวิชาการล้วนๆที่มันไม่ก่อให้เกิดปัญหาและฉันแค่สนใจที่จะฟังคำอธิบายเกี่ยวกับพฤติกรรม
รับปัญหามาตรฐาน Itzik Ben-Gan ตารางเข้าร่วม 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 แล้วผลลัพธ์เดียวกันทั้งคู่ ความคิดใด ๆ ที่ทำให้เกิดสิ่งนี้?
