2016-06-27 5 views
0

私はゆっくり実行されるSQLストアドプロシージャのパフォーマンスを向上させるために取り組んでいます。SQL Serverの最大機能はSargableですか?

一般に、クエリで使用する実行計画を最適化しようとしています。私の質問には、以下のSQLスニペットが含まれています。このSQL sargableは、特にMax関数ですか?

SELECT MAX(Audit_Date) AS DATE, 
      FK_RegisterID 
    FROM dbo.[Audit Result Entry Detail] 
    INNER 
    JOIN dbo.[Audit Register] 
     ON dbo.[Audit Result Entry Detail].FK_RegisterID = dbo.[Audit Register].PK_ID 
    WHERE ((SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, Audit_Date))) >= @StartDate 
     AND (SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, Audit_Date))) <= @EndDate) 
     AND part_number IN (@ParticipantNumber) 
    GROUP 
     BY FK_RegisterID 

助けてください。

+5

Sargableはフィルタに適用されます。あなたの場合はsargableではない 'WHERE'節のようなものです。集計ではありません。 –

+3

'Audit_Date> = @StartDateとAudit_Date

+2

「DATEADD」の近くで内部の「選択」を失うことはありません.SQL Management Studioを使用している場合、**クエリ**メニューから**実際の実行計画を含める**を使用することをお勧めします。これは、あなたのクエリを修正するための良い情報を提供し、インデックスがない場合にも表示されます。 – Pete

答えて

0

コメントありがとうございました。私はこれをオンラインで見つけ、私のSQLクエリをもっと賢明にする方法を理解する助けになりました。

SQLクエリを非sargableにする典型的な状況は、WHERE句に列の値で動作する関数を含めることです。 WHERE句は、sargabilityが重要な唯一の節ではありません。 ORDER BY、GROUP BY、およびHAVING句にも影響を与えることができます。

一方、SELECT節には、パフォーマンスに悪影響を与えることなく、非sargeable 式を含めることができます。

+0

はい、これは、@ DStanleyのコメントについてのものですが、SQL Serverの内部的な自動再配置がはるかに優れていると聞いています –

関連する問題