これは純粋にアカデミックな質問であり、問題を引き起こしていないので、その振る舞いの説明を聞きたいだけです。
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
100万行のテーブルを作成するクエリを発行します。
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でこれを試しましたが、両方で同じ結果が得られました。何がこれを引き起こす可能性があるかについての考えはありますか?