이것은 순전히 학문적 인 질문이므로 문제를 일으키지 않으며 행동에 대한 설명을 듣고 싶습니다.
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
백만 개의 행 번호 테이블을 작성하는 조회를 발행하십시오.
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에서 이것을 시도했지만 두 결과 모두 동일합니다. 무엇이 이것을 일으킬 수 있는지에 대한 생각이 있습니까?
