2014-04-10 110 views
1

以下所用的所有示例目前僅適用於一個銷售組織,並且以後我們可能會有更多不同的銷售組織編號。如何優化返回數百萬條記錄的SQL查詢

我有6個表有數百萬條記錄。這些表由執行SSIS包填充。

select count(*) from tmp_materials --11,02,032 

select count(*) from tbl_VendorLogoData --20,41,501 
select count(*) from TBL_Image_EDV --4,44,063 
select count(*) from TBL_EXTPRODUCTATTRIBUTES_EDV -- 2,06,15,572 
select count(*) from TBL_Accessories_EDV --10,11,568 
select count(*) from TBL_SimilarSku --64,10,408 

我有一個用來從這些表

SELECT DISTINCT 'MD' AS [COMPANYCD] 
        , MAIN.MATERIAL AS [MATERIAL] 
        , ISNULL(UPPER(IMG.[lowprovider]),'') AS [LOW_IMAGE] 
        , ISNULL(UPPER(IMG.[midprovider]), '') AS [MID_IMAGE] 
        , ISNULL(UPPER(IMG.[highprovider]), '') AS [HIGH_IMAGE] 
        , ISNULL(UPPER(VS.isLogo),'') AS [VENDOR_LOGO] 
        , ISNULL(UPPER(DS.PROVIDER), '') AS [DATASHEET] 
        , ISNULL(ACC.AccessoryMaterial, '') AS [OPT_ACC] 
        , ISNULL(UPPER(ACC.Provider), '') AS [OPT_ACC_PROVIDER]  
        , ISNULL(SS.Similarsku, '') AS [SIMILAR_SKU] 
        , ISNULL(UPPER(SS.ProviderName), '') AS [SIMILAR_SKU_PROVIDER] 
FROM   tmp_materials MAIN WITH (NOLOCK) 
LEFT OUTER JOIN TBL_Image_EDV IMG WITH (NOLOCK) ON MAIN.MATERIAL = IMG.MATERIAL AND MAIN.salesOrg = IMG.SalesOrganization 
LEFT OUTER JOIN TBL_EXTPRODUCTATTRIBUTES_EDV DS WITH (NOLOCK) ON MAIN.MATERIAL = DS.SKUNBR AND MAIN.salesOrg = DS.SalesOrganization 
LEFT OUTER JOIN TBL_Accessories_EDV ACC WITH (NOLOCK) ON MAIN.MATERIAL = ACC.ParentSKU AND MAIN.salesOrg = DS.SalesOrganization 
LEFT OUTER JOIN TBL_SimilarSku SS WITH (NOLOCK) ON MAIN.MATERIAL = SS.ParentSKU AND MAIN.salesOrg = DS.SalesOrganization 
LEFT OUTER JOIN tbl_VendorLogoData VS WITH (NOLOCK) ON MAIN.MATERIAL = VS.SKU AND MAIN.salesOrg = VS.Salesorganization 
WHERE   MAIN.salesOrg = @SALESORGANIZATION 
       AND (CASE WHEN IMG.MATERIAL IS NULL AND DS.SKUNBR IS NULL AND ACC.ParentSKU IS NULL AND SS.ParentSKU IS NULL AND VS.SKU IS NULL 
          THEN 0 ELSE 1 END) = 1 
       AND DS.Provider <> 'novalue' 
       AND SS.RecordIdentifier like '%@@%' 
       AND ACC.RecordIdentifier like '%@@%' 
       AND ACC.accessorySku LIKE '%@@%' 

這些過程中的參數是@SALESORGANIZATION這是用來填充報告中選擇不同的記錄的存儲過程。我正在運行這個多個銷售組織值。但是對於其中一個銷售組織來說,它需要超過5個小時才能生成數據。

看來我需要編寫一個循環,但發現難以繼續多個連接的任何建議嗎?

請指教我如何優化此查詢?謝謝你的幫助。

有你有一個執行計劃文件SQL Execution Plan

+1

要檢查的第一件事是執行計劃 – cha

+0

只要給我總計時間添加執行計劃,我正在填充它.. – Murtaza

+0

執行計劃鏈接添加在問題中,請參閱select語句計劃。 – Murtaza

回答

0

嘗試以包括更多的條件來提高性能。

在所有LEFT OUTER JOIN檢查包括直接的參數,並儘量避免JOINDE表使用有 如

LEFT OUTER JOIN TBL_Image_EDV IMG WITH (NOLOCK) ON 
MAIN.MATERIAL = IMG.MATERIAL 
AND MAIN.salesOrg = IMG.SalesOrganization 
AND [email protected] 

添加條件在WHERE

AND SS.RecordIdentifier like '%@@%' 

應該

(SS.id IS NOT NULL AND SS.RecordIdentifier like '%@@%') 

因此,你首先切割行沒有關係

UPDATE

還有一個想法

嘗試

INNER JOIN (select * 
       from TBL_Accessories_EDV 
       where RecordIdentifier like '%@@%' 
        AND accessorySku LIKE '%@@%') ACC WITH (NOLOCK) 
ON MAIN.MATERIAL = ACC.ParentSKU AND MAIN.salesOrg = DS.SalesOrganization 

只是爲了限制你過濾掉的記錄大寫金額後

+0

我會嘗試這個,但我需要總結具體的解決方案,這將減少執行的分鐘數,但由於執行需要超過10個小時。我想減少小時數並在大約2或3小時的時間內生成輸出 – Murtaza

+0

select *從MAIN返回多少條記錄,其中MAIN.salesOrg = @SALESORGANIZATION? – StanislavL

+0

它在問題 - 「從tmp_materials選擇計數(*)--11,02,032'實際上連接正在乘數據.. – Murtaza

相關問題