2013-04-14 9 views
5

एम्प्नो पर क्लस्टर्ड अद्वितीय इंडेक्स के साथ तालिका संरचना।यह क्वेरी निष्पादन योजना में दो जुड़ने वाले ऑपरेटरों को कैसे उत्पन्न करती है?

CREATE TABLE [dbo].[EMP](
    [EMPNO] [int] NOT NULL, 
    [ENAME] [varchar](10) NULL, 
    [JOB] [varchar](9) NULL, 
    [MGR] [int] NULL, 
    [HIREDATE] [datetime] NULL, 
    [SAL] [int] NULL, 
    [COMM] [int] NULL, 
    [DEPTNO] [int] NULL 
) ON [PRIMARY] 

क्वेरी

SELECT sal,sum(sal) over(PARTITION BY empno) 
FROM emp 

क्वेरी योजना

enter image description here

उत्तर

3

विडों समुच्चय के साथ योजनाओं को आम तौर पर एक आम उप अभिव्यक्ति स्पूल का उपयोग करें। योजना के इस प्रकार का एक अच्छा लिखने अप Partitioning and the Common Subexpression Spool

मान लीजिए तालिका निम्न पंक्तियों

CREATE TABLE [dbo].[EMP](
    [EMPNO] [int] NOT NULL, 
    [SAL] [int] NULL) 

INSERT INTO [dbo].[EMP] 
VALUES (1,1), 
     (1,2), 
     (1,3), 
     (1,4), 
     (2,1), 
     (2,2) 

यह 2 अलग EMPNO मूल्यों के साथ कुल 6 पंक्तियां हैं है यहाँ है। वास्तविक निष्पादन योजना दिखाए गए पंक्तियों की वास्तविक संख्या नीचे दी गई है।

enter image description here

योजना के शीर्ष पर खंड इटरेटर पंक्तियों है कि यह दर्शाता है, जब यह एक नया विभाजन की शुरुआत (अर्थात empno बदल गया है) है के माध्यम से पारित करने के लिए एक ध्वज जोड़ता है।

इसके तत्काल बाएं (प्राथमिक स्पूल) के स्पूल को सेगमेंट इटरेटर से एक समय में एक पंक्ति मिलती है और इसे tempdb में एक कार्य तालिका में डाल देती है। एक बार यह ध्वज कहता है कि एक नया समूह शुरू हो गया है, यह नेस्टेड लूप ऑपरेटर के शीर्ष इनपुट में एक पंक्ति देता है।

इससे कार्य तालिका (पंक्ति में द्वितीयक स्पूल) में पंक्तियों पर धारा को कुल करने का कारण बनता है, SUM([SAL]) की गणना की जाती है तो यह मान कार्य तालिका में पंक्तियों के साथ वापस जुड़ जाता है (तीसरा स्पूल ऑपरेटर योजना) कार्य तालिका से पहले नए समूह के लिए तैयार कर दिया गया है।

प्राथमिक खंड स्पूल आदेश अंतिम ग्रुप संसाधित जिसके कारण उत्सर्जित पंक्तियों की वास्तविक संख्या के रूप में 3 (समूहों की संख्या के अलावा एक) OVER खंड के साथ

0

सकल कार्यों दिखाया गया है प्राप्त करने के लिए एक डमी पंक्ति का उत्सर्जन करता है सकते हैं इस प्रकार फिर से लिखा जाए: तालिका से एएस एक्स इनर जॉइन (चयन विभाजन कॉलम, समेकित विथआउटऑवरक्लोज़ (...) ... से ... जैसे y y x.PartitionColumns = y.PartitionColumns (यदि विभाजन कॉलम अनिवार्य हैं - न्यूल नहीं)।

उदाहरण:

SET STATISTICS IO ON; 
SET NOCOUNT ON; 

-- OP's query 
SELECT sal,sum(sal) over(PARTITION BY empno) 
FROM emp; 

-- Reqwriten query 
SELECT a.sal, b.SumSal 
FROM emp a 
INNER JOIN (SELECT EMPNO, SUM(sal) AS SumSal FROM emp GROUP BY EMPNO) b ON a.EMPNO = b.EMPNO; 

परिणाम:

sal   
----------- ----------- 
1   10 
2   10 
3   10 
4   10 
1   3 
2   3 

Table 'Worktable'. Scan count 3, logical reads 21, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 
Table 'EMP'. Scan count 1, logical reads 2, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 

sal   SumSal 
----------- ----------- 
1   10 
2   10 
3   10 
4   10 
1   3 
2   3 

Table 'Worktable'. Scan count 3, logical reads 21, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 
Table 'EMP'. Scan count 1, logical reads 2, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 

निष्पादन की योजना: enter image description here

यह केवल पिछले में शामिल होने की व्याख्या करेगा: enter image description here

के लिए स्पष्टीकरण पहले अनुभाग में प्रति-समूह प्रसंस्करण/Partitioning and the Common Subexpression Spool अनुभाग में पाया जा सकता है।

संबंधित मुद्दे