2012-06-05 9 views
8

मेरे पास एक तालिका चर है और मैं इसमें "सम्मिलित करें - चयन करें" कथन का उपयोग करके कुछ मान डाल रहा हूं। चयन कुछ जोड़ों का संयोजन है, और जब इसे अलग से निष्पादित किया जाता है तो इसमें 3 सेकंड लगते हैं। समस्या यह है कि पूरे कोड को निष्पादित करने में 3-4 मिनट लगते हैं। मुझे आश्चर्य है कि इसके लिए एक विशेष कारण है।टी-एसक्यूएल सम्मिलित करें - तालिका चर में चयन बहुत धीमा है

यह मेरी मेज चर घोषणा है:

DECLARE @Result TABLE 
(
    ProductID NVARCHAR(25) PRIMARY KEY 
    ,ProductName NVARCHAR(100) 
    ,ProductCategoryID TINYINT 
    ,ProductCategory NVARCHAR(50) 
    ,ProductSubCategoryID TINYINT 
    ,ProductSubCategory NVARCHAR(50) 
    ,BrandID TINYINT 
    ,Brand NVARCHAR(50) 
) 

मैं एक अन्य तालिका चर जो मैं कुछ डेटा के साथ प्रारंभ किया है, और यह इसकी संरचना है:

DECLARE @TempTable TABLE 
(
    ProtoSurveyID INT, 
    ProductID NVARCHAR(25) PRIMARY KEY 
) 

और निम्नलिखित कोड है मेरी समस्या कथन (डालें - चयन करें):

INSERT INTO @Result (ProductID,ProductName,ProductCategoryID,ProductCategory,ProductSubCategoryID,ProductSubCategory,BrandID,Brand) 
SELECT 
     Products.ProductID AS ProductID 
     ,Products.ProductName AS ProductName 
     ,ProductCategories.ProductCategoryID AS ProductCategoryID 
     ,ProductCategories.ProductCategory AS ProductCategory 
     ,ProductSubCategories.ProductSubCategoryID AS ProductSubCategoryID 
     ,ProductSubCategories.ProductSubCategory AS ProductSubCategory 
     ,Brands.BrandID AS BrandID 
     ,Brands.Brand AS Brand 
FROM 
(
     SELECT  
       CAST(A.Col001 AS tinyint) AS ProductCategoryID 
       ,CAST(A.Col002 AS tinyint) AS BrandID 
       ,CAST(A.Col003 AS nvarchar(25)) AS ProductID 
       ,CAST(A.Col004 AS nvarchar(100)) AS ProductName 
       ,CAST(A.Col006 As tinyint) AS ProductSubCategoryID 
       ,B.ProtoSurveyID 
     FROM DataSetsMaterializedDataSqlvariant A 
     INNER JOIN @TempTable B 
     ON B.ProductID=CAST(A.Col003 AS nvarchar(25)) 
     WHERE DataSetsMaterializedInternalRowsetID = 3 
) Products  
INNER JOIN 
(
     SELECT CAST(A.Col001 AS tinyint) AS BrandID 
       , CAST(A.Col002 AS nvarchar(50)) AS Brand 
     FROM DataSetsMaterializedDataSqlvariant A 
     WHERE DataSetsMaterializedInternalRowsetID = 1 
)Brands On Products.BrandID=Brands.BrandID 
INNER JOIN 
(
     SELECT CAST(A.Col001 AS tinyint) AS ProductCategoryID 
       ,CAST(A.Col002 AS nvarchar(50)) AS ProductCategory 
     FROM DataSetsMaterializedDataSqlvariant A 
     WHERE DataSetsMaterializedInternalRowsetID = 2 
) ProductCategories On Products.ProductCategoryID=ProductCategories.ProductCategoryID 
INNER JOIN 
(
     SELECT CAST(A.Col001 AS tinyint) AS ProductSubCategoryID 
       , CAST(A.Col002 AS nvarchar(50)) AS ProductSubCategory 
     FROM DataSetsMaterializedDataSqlvariant A 
     WHERE DataSetsMaterializedInternalRowsetID = 11 
) ProductSubCategories on Products.ProductSubCategoryID=ProductSubCategories.ProductSubCategoryID 

जैसा कि मैंने पहले बताया था, अगर मैं इसमें टिप्पणी करता हूं सर्ट लाइन में क्वेरी 3 सेकंड लगती है, अन्यथा - बहुत लंबा समय।

संपादित करें: यहां मेरी निष्पादन योजना है - अधिकांश लागत तालिका स्कैन है, लेकिन डालने के दौरान इतना समय क्यों लगता है, और इसके बिना जल्दी होता है?

CREATE FUNCTION [dbo].[fn_XxCustom_RetailAudits_GetProductsForFilter] 
(
    @SecurityObjectUserID BIGINT 
) 
RETURNS TABLE 
AS 
RETURN 

    WITH CTE(ProtoSurveyID,ProductID) AS 
    (
     SELECT DISTINCT CAST(B.ProtoSurveyID AS INT) 
         ,CAST(A.Col002 AS NVARCHAR(25)) AS ProductID 
     FROM DataSetsMaterializedDataSqlvariant A 
     JOIN SurveyInstances B ON A.Col001=B.SurveyInstanceID AND CAST(B.ProtoSurveyID AS INT) IN (SELECT ProtoSurveyID FROM dbo.fn_Filter_GetProtoSurveysAllowedShort(@SecurityObjectUserID, 'CLIENTACCESS',NULL)) 
     WHERE DataSetsMaterializedInternalRowsetID = 5 
    ) 
    SELECT 
      Products.ProductID AS ProductID 
      ,Products.ProductName AS ProductName 
      ,ProductCategories.ProductCategoryID AS ProductCategoryID 
      ,ProductCategories.ProductCategory AS ProductCategory 
      ,ProductSubCategories.ProductSubCategoryID AS ProductSubCategoryID 
      ,ProductSubCategories.ProductSubCategory AS ProductSubCategory 
      ,Brands.BrandID AS BrandID 
      ,Brands.Brand AS Brand 
    FROM 
    (
      SELECT  
        CAST(A.Col001 AS tinyint) AS ProductCategoryID 
        ,CAST(A.Col002 AS tinyint) AS BrandID 
        ,CAST(A.Col003 AS nvarchar(25)) AS ProductID 
        ,CAST(A.Col004 AS nvarchar(100)) AS ProductName 
        ,CAST(A.Col006 As tinyint) AS ProductSubCategoryID 
        ,B.ProtoSurveyID 
      FROM CTE B 
      INNER JOIN DataSetsMaterializedDataSqlvariant A 
      ON B.ProductID=CAST(A.Col003 AS nvarchar(25)) 
      WHERE DataSetsMaterializedInternalRowsetID = 3 
    ) Products  
    INNER JOIN 
    (
      SELECT CAST(A.Col001 AS tinyint) AS BrandID 
        ,CAST(A.Col002 AS nvarchar(50)) AS Brand 
      FROM DataSetsMaterializedDataSqlvariant A 
      WHERE DataSetsMaterializedInternalRowsetID = 1 
    )Brands On Products.BrandID=Brands.BrandID 
    INNER JOIN 
    (
      SELECT CAST(A.Col001 AS tinyint) AS ProductCategoryID 
        ,CAST(A.Col002 AS nvarchar(50)) AS ProductCategory 
      FROM DataSetsMaterializedDataSqlvariant A 
      WHERE DataSetsMaterializedInternalRowsetID = 2 
    ) ProductCategories On Products.ProductCategoryID=ProductCategories.ProductCategoryID 
    INNER JOIN 
    (
      SELECT CAST(A.Col001 AS tinyint) AS ProductSubCategoryID 
        ,CAST(A.Col002 AS nvarchar(50)) AS ProductSubCategory 
      FROM DataSetsMaterializedDataSqlvariant A 
      WHERE DataSetsMaterializedInternalRowsetID = 11 
    ) ProductSubCategories on Products.ProductSubCategoryID=ProductSubCategories.ProductSubCategoryID 

GO 

मैं धीरे धीरे फिर से चलाता है:

enter image description here

पालन मेरी नई इनलाइन कार्य है। कोई विचार यह कैसे अनुकूलित करने के लिए?

+3

क्वेरी विश्लेषक की "योजना की व्याख्या करें" बटन का उपयोग करें ताकि आपको यह दिखाया जा सके कि समय कहां लिया जा रहा है। –

+0

@ जेफ वाटकिन्स मैं अपने प्रश्न के लिए निष्पादन योजना के साथ स्क्रीनशॉट संलग्न करने जा रहा हूं। – gotqn

+0

यदि आप एक temp तालिका में चुनते हैं तो क्या होता है? –

उत्तर

11

तालिका चर में डालने वाली क्वेरीज़ में समांतर योजना नहीं हो सकती है।

तालिका का उपयोग करने की बजाय SELECT को समांतर बनाने की अनुमति देने के लिए प्रयास करें।

+0

@ जोरो - क्या आप इसे एक बहु स्टेटमेंट के बजाय एक इनलाइन टीवीएफ के रूप में लिख सकते हैं? फिर वह मध्यवर्ती तालिका चर में डालने की आवश्यकता से बच जाएगा। इसका मतलब है कि आप एक ही कथन होने के लिए क्वेरी को फिर से लिखते हैं। '@ TempTable' –

+0

@MartinSmith की भूमिका को प्रतिस्थापित करने के लिए सीटीई या व्युत्पन्न तालिका का उपयोग करना मैं किसी भी प्रकार के फ़ंक्शन का उपयोग कर सकता हूं, लेकिन मैंने सोचा है कि तालिका वापस करने का एकमात्र तरीका यह है? – gotqn

+0

@ जोरो - नहीं टीवीएफ के दो अलग-अलग प्रकार हैं। इनलाइन वाले लोग अधिक कुशल होते हैं क्योंकि वे ऑप्टिमाइज़र द्वारा रेखांकित होते हैं लेकिन एक SQL स्टेटमेंट में तर्क के लिए तर्क की आवश्यकता होती है। –

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