SARGabilityに関する質問


11

私は私が何かを正しく理解していることを確認する必要があります:

私は最近、ユーザーがLinqに次のような回答を投稿したSO質問を表示しました。

from p in db.table where p.column.AddMinutes(1) > DateTime.Now select p

Linqに不慣れな方には、そのステートメントの出力(公平にテストされていません)は次のようになると思います。

SELECT *
FROM table t
WHERE DATEADD(min, 1, t.column) >= GETDATE() 

私はこれに対する返信を投稿し、日時操作は変数(この場合はGETDATE())に対して行う必要があるため、実際にはステートメントは次のようなものを反映する必要があります。

SELECT *
FROM table t
WHERE t.column >= DATEADD(min, -1, GETDATE())

私の返答で、私が今確信していないビットは、次のように仮定します:

  1. 列の操作のため、インデックスは使用されません
  2. 上記の理由により、クエリプランは一部異なります(テストされていないため、テストされています)。
  3. 上記のため、最初のクエリは実際には2番目のクエリよりもパフォーマンスが低下します。

私の質問:

私の推論で何かを逃したことがありますか?私は正しいですか?最後に、SARGabilityに関する優れた記事がある団体はありますか?

回答:


6
  1. 正しい
  2. 必ずしもそうとは限りません。適切なインデックスが存在するかどうか、およびCBOがそれを使用するかどうかによって異なります。たとえば、テーブルが小さい場合、または統計によりオプティマイザが結果の大部分に対してフィルタが真であると信じる場合、FTSのコストが低いと見なされる場合があります。
  3. これは保証されていません-2番目のクエリのパフォーマンスが低下する可能性さえあります-しかし、あなたの推論は根本的に健全です。たとえば、FTSが実際に高速であるエッジケースでは、CBOはコストの最良の推測に基づいてインデックススキャンを選択する場合があります。

少しグーグルすると、このSOの質問とSARGability に関するこの興味深い見た目の記事が見つかりました


5

ジャックの言う通りなので、繰り返しはしません。

式の検索可能性に関して、私が気に入っている記事をいくつか追加します。

SQL Serverの経験が豊富な優れたライターです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.