2017-06-16 54 views
0

下面的查询运行7小时。任何人都可以帮助我优化查询?Query Optimitize

select count(1) 
FROM  temp_raw_appointments trp 
left join temp_raw_transactions_sep tra 
on  case when tra.[rndrng prvdr] in (SELECT [rndrng prvdr] 
              FROM temp_raw_changetosupprov) 
        then tra.[sup prvdr] 
       when tra.[rndrng prvdr] = 'P003_BMI_WidermannJ' 
        then 'P003_WiedermannJ' -- Kim Chirayil's customization, 06/16 
       when tra.[rndrng prvdr] = 'P014_HeerenK' 
        then 'P014_HarrisonL' -- Kim Chirayil's customization, 06/16 
       else tra.[rndrng prvdr] end 
      =trp.[appt schdlng prvdr] 
where  tra.[rndrng prvdr] is null 
+0

你的执行计划是什么样的?你可以使用'where not exist'而不是'where null'来帮助你 – dbajtr

+0

什么是表格的键?你有什么指标在桌子上? –

+1

你可以在这里粘贴我们的查询执行计划吗? https://www.brentozar.com/pastetheplan/ – Hybris95

回答

0

尝试将查询分为两个部分

CREATE TABLE #inter 
    (
    temp_col VARCHAR(500) 
) 

INSERT INTO #inter 
SELECT Distinct CASE 
     WHEN tra.[rndrng prvdr] IN (SELECT [rndrng prvdr] 
            FROM temp_raw_changetosupprov) THEN tra.[sup prvdr] 
     WHEN tra.[rndrng prvdr] = 'P003_BMI_WidermannJ' THEN 'P003_WiedermannJ' -- Kim Chirayil's customization, 06/16 
     WHEN tra.[rndrng prvdr] = 'P014_HeerenK' THEN 'P014_HarrisonL' -- Kim Chirayil's customization, 06/16 
     ELSE tra.[rndrng prvdr] 
     END AS temp_col 
FROM temp_raw_transactions_sep tra 

CREATE NONCLUSTERED INDEX nix_inter 
    ON #inter (temp_col) 

SELECT Count(1) 
FROM temp_raw_appointments trp 
WHERE NOT EXISTS (SELECT 1 
        FROM #inter 
        WHERE trp.[appt schdlng prvdr] = temp_col) 

因为它是运行近7小时,我感到没有料到的执行计划。如果你有一个请提供进一步建议

+0

我正在检查您的答案以及配置文件。你会在一般的聊天中解释如何解决与“优化”有关的问题吗? –

+1

@PrabhatG - 分割代码不是正确的方法来优化,但我觉得这可能会有所作为。但只有通过测试我们才能得出结论。优化包括很多因素。它从表格设计,索引,统计,连接的正确使用等开始。 –

0

试试这个:更新加入条件的逻辑。这可能有助于性能调整。

select count(1) 
FROM temp_raw_appointments trp 
left join temp_raw_transactions_sep tra on (tra.[sup prvdr] = trp.[appt schdlng prvdr] AND EXIST (SELECT 1 FROM temp_raw_changetosupprov [rndrng prvdr] =tra.[rndrng prvdr]) 
OR (trp.[appt schdlng prvdr] = tra.[rndrng prvdr] AND tra.[rndrng prvdr] IN ('P003_BMI_WidermannJ','P014_HeerenK')) 
OR (tra.[rndrng prvdr] = trp.[appt schdlng prvdr]) 
where tra.[rndrng prvdr] is null 
0

当然,这将是很好看的执行计划,执行统计和行数,但是,考虑这个猜测为可能的解决方案:

1)确保TRA [ rndrng prvdr](理想情况下在索引中包含列或第二个键),temp_raw_changetosupprov。[rndrng prvdr],trp。[appt schdlng prvdr]列被索引。 2)重写查询以提高效率。既然你只对LEFT JOIN后的IS NULL行感兴趣,我猜以下查询的逻辑将是正确的:

WITH SupPrvdr([sup prvdr]) 
AS 
(
    SELECT tra.[sup prvdr] FROM temp_raw_transactions_sep tra 
    WHERE tra.[rndrng prvdr] IN 
    (
     SELECT [rndrng prvdr] FROM temp_raw_changetosupprov 
     UNION 
     SELECT 'P003_WiedermannJ' AS [rndrng prvdr] 
     UNION 
     SELECT 'P014_HarrisonL'AS [rndrng prvdr] 
    ) 
) 
SELECT COUNT(*) FROM temp_raw_appointments trp 
WHERE trp.[appt schdlng prvdr] NOT IN (SELECT [sup prvdr] FROM SupPrvdr) 
    OR trp.[appt schdlng prvdr] IS NULL -- if trp.[appt schdlng prvdr] is nullable column this condition can be omitted