2016-07-30 2 views
0

私は約3秒間実行される以下のクエリでパフォーマンスをインポータしようとしています。 SQLでの実行計画の分析と索引付けは初めてのことです。mssql日付フィールドのパフォーマンスの問題

私は既にDateFromとDateToのファイル(2つの別々のインデックスと1つの結合インデックス)でインデックスを作成しています。私はDateLiveActualファイルのインデックス作成を試みましたが、これらのインデックスのどれも実行計画に表示されていません。

クエリの最適化にご協力いただけますか?

declare @today date = convert(date,GETUTCDATE()); 
DBCC DROPCLEANBUFFERS 

SELECT 
      S.LocationId 
      ,SBP.CurrencyId 
      ,SUM(CASE 
        WHEN S.ServiceStatusId = 1 THEN COALESCE (SBP.MRR, 0) 
        ELSE 0 
       END) AS ActiveMRR 
      ,MIN(S.DateLiveActual) AS MinServiceDateLiveActual 
     FROM dbo.service_Service AS S 
     INNER JOIN dbo.billing_ServiceBillingPeriod AS SBP ON SBP.ServiceId = S.Id 
     WHERE 
      SBP.DateFrom <= @today AND (SBP.DateTo >= @today OR SBP.DateTo IS NULL) 
     GROUP BY S.LocationId, SBP.CurrencyId 

enter image description here

答えて

1

私はずっとあなたが行うことができますが存在しないと思います。実行計画で矢印の太さから推測できるように、where句はあまり選択的ではありません。あなたは小さなインデックス・ツリーを使用してbilling_ServiceBillingPeriodから読み込まれたバイト数を削減しようとすることができます:

CREATE INDEX IX_DateRange 
ON billing_ServiceBillingPeriod(DateFrom, DateTo) 
INCLUDE (CurrencyId,ServiceID,MRR) 

ずっとあなたが多くの行(太い矢印)がある場合はハッシュ結合を行うことができますがありません。マージ結合は高速ですが、順序付けされた結果セットが必要です(日付が使用されたレコードは日付順に並べ替えられ、service_Service.Idは順序付けされていません)。繰り返しますが、ハッシュテーブルを作成するディスクの使用量を減らすことができます。

+0

インデックス作成でperfが1秒改善されました。ありがとうございます。しかし、Min(DateLiveScheduled)には1秒かかります。とにかくそれをスピードアップできるのですか?実際にはservice_Serviceテーブル上にあるので、SQLではデフォルトでPKのインデックスが使用されます。 – Raghav