2013-08-07 9 views
5

मेरे पास एकाधिक सीटीई के साथ काफी जटिल क्वेरी है लेकिन 1 मुख्य सीटीई जो अन्य सभी खींचती है, क्या इसका कारण मुख्य सीटीई को कई बार निष्पादित किया जाता है?एक ही क्वेरी में सीटीई को कई बार कॉल करना

उत्तर

2

पर एक नजर है।

उदाहरण: यदि आप इस क्वेरी

SELECT h.ProductID,h.StandardCost, 
     x.AvgPrice 
FROM Production.ProductCostHistory h 
CROSS JOIN (
    SELECT AVG(p.ListPrice) AvgPrice 
    FROM Production.Product p 
) x 

AdventureWorks2008R2 डेटाबेस का उपयोग कर निष्पादित तो वास्तविक कार्य योजना लागू हो जाएगा enter image description here

1

एक आप निष्पादन योजना है कि Vals CTE खंड दो बार निष्पादित किया जाता है से देखेंगे इस SQL Fiddle DEMO

पर नीचे

DECLARE @Table TABLE(
     ID INT, 
     Val VARCHAR(50), 
     TypeID INT 
) 

DECLARE @TableTypes TABLE(
     TypeID INT, 
     TypeName VARCHAR(50) 
) 

;WITh Vals AS (
     SELECT * 
     FROm @Table 
     WHERE ID > 10 
) 
, UsingVals1 AS (
     SELECT v.*, 
       tt.TypeName 
     FROm Vals v INNER JOIN 
       @TableTypes tt ON v.TypeID = tt.TypeID 
) 
, UsingVals2 AS (
     SELECT v.*, 
       tt.TypeName 
     FROm Vals v INNER JOIN 
       @TableTypes tt ON v.TypeID = tt.TypeID 
     WHERE tt.TypeName LIKE '%%' 
) 
SELECT * 
FROM UsingVals1 
UNION 
SELECT * 
FROM UsingVals2 

और फिर पर नज़र डालें। cteFiveYear के लिए

SELECT 
    AVG(CASE WHEN instructorID = @instructorID THEN score END) InstructorSemesterAverage, 
    STDEVP(CASE WHEN instructorID = @instructorID THEN score END) InstructorSemesterSTDeviation, 
    AVG(CASE WHEN subjectCode = @subjectCode THEN score END) DepartmentSemesterAverage, 
    STDEVP(CASE WHEN subjectCode = @subjectCode THEN score END) DepartmentSemesterSTDeviation, 
    AVG(CASE WHEN [email protected] AND Q.year = @year AND semester = @semester THEN score END) ClassScore, 
    STDEVP(CASE WHEN [email protected] AND Q.year = @year AND semester = @semester THEN score END) ClassSTDeviation, 
    (SELECT DecTile FROM cteNtile WHERE instructorID = @instructorID)*10 DecTile, 
    X.DepartmentClassFiveYearAverage AS DepartmentClassFiveYearAverage, 
    X.DepartmentClassFiveYearSTDeviation AS DepartmentClassFiveYearSTDeviation, 
    X.InstructorClassFiveYearAverage AS InstructorClassFiveYearAverage, 
    X.InstructorClassFiveYearSTDeviation AS InstructorClassFiveYearSTDeviation 
FROM 
    cteMain Q CROSS JOIN cteFiveYear X 

यह कई फांसी पाएगा (वास्तविक कार्य योजना लागू करने के लिए Number of Executions संपत्ति देखें):

हो सकता है कि यह भी आप क्रॉस इस प्रकार शामिल हों इस्तेमाल कर सकते हैं How many times the T-SQL inside the CTE is executed?

+0

धन्यवाद मैं थोड़ा के लिए googled लेकिन कुछ भी निर्णायक नहीं मिल सकता है, मैं मुझे लगता है कि इसके लिए temp टेबल का उपयोग करना होगा क्योंकि यह गुड़ के रूप में धीमा है। – Preston

+2

@ प्रेस्टन, आप temp तालिकाओं का उपयोग शुरू करने से पहले, मैं आपकी क्वेरी के लिए निष्पादन योजना को देखने और यह निर्धारित करने की सलाह दूंगा कि कोई अनुक्रमणिका रणनीति क्वेरी प्रदर्शन में सुधार करेगी – zedfoxus

+0

@zfus दुर्भाग्य से यह मेरा डेटाबेस नहीं है, यह वास्तव में मेरे विश्वविद्यालय में मुख्य परीक्षण डेटाबेस है और जब वे मेरी क्वेरी को संग्रहीत प्रो में डालते हैं तो वे मेरे लिए अन्य बदलाव नहीं करेंगे। – Preston

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