2017-06-16 24 views
0

以下のクエリは7時間実行されています。誰も私がクエリを最適化するのを助けることができますか?クエリの最適化

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

whats実行計画はどうですか?助けてくれる 'where is null'の代わりに 'where not exist'を使うことができます – dbajtr

+0

テーブルのキーは何ですか?テーブルにはどのようなインデックスがありますか? –

+1

ここにクエリ実行プランを貼り付けることはできますか? https://www.brentozar.com/pastetheplan/ – Hybris95

答えて

0

私が実行計画を期待していないです過去7時間実行されているので、二つの部分

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) 

にクエリを分割してください。あなたが持っている場合はさらに提案するために提供してください

+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](インデックス内に[sup prvdr]が含まれている列または2番目のキーを含むのが理想です)、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