2014-04-10 111 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

相关问题