यह एक विशुद्ध रूप से अकादमिक प्रश्न है, इस कारण यह समस्या पैदा नहीं कर रहा है और मैं व्यवहार के लिए किसी भी स्पष्टीकरण को सुनने के लिए इच्छुक हूं।
एक मानक मुद्दा इट्ज़िक बेन-गण क्रॉस सीटीई टैली तालिका में शामिल हों:
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 पर अब तक यह कोशिश कर चुका हूं, दोनों पर समान परिणाम। क्या यह कारण हो सकता है के रूप में किसी भी विचार?