Db2よりも述語情報の評価モードについて詳しい情報を提供するデータベースはありません。とは言え、単に実行計画において 述語情報がIXSCAN、 または稀ですがフィルタ述語の、開始と終了の両方あるいは片方の条件に 使われるかどうかを表示するだけです。さらに、sargと言う 単語の古い意味を使っているので混乱しやすいものになっています。
昔、IBMの研究者はこの種類の検索条件を「sargableな述語」と呼んだが、それはSARGがSearch ARGumentの略語だったからだ。その後、MicrosoftとSybaseが「sargable」に対して、 「インデックスを使って検索できる」という意味を再定義したのだった。
— SQL Performance Tuning(訳は訳者による)
筆者にはどちらの定義もあまり役に立たないように思えたので、この単語は本文中では使わないようにしています。しかし、Db2の実行計画の
フィルタ述語にはSARG
と言うラベルがつきます。この場合、IBM
Db2は上に書いた中でも「オリジナルの」意味で使っているという事に
注意してください。これは、ドキュメントの記述により裏付けられます。
索引検索引数述部(Index sargable)は、 検索の範囲を限定するためには使用されず、選択された場合に索引から評価されます。 これは、この述部に関係する列が索引キーの一部であるためです。 これらの述部も、索引マネージャーによって評価されます。
データ検索引数述部(Data sargable)は、 索引マネージャーでは評価できない述部ですが、データ管理サービス(DMS) によって評価できます。通常、これらの述部には、 基本表の個々の行へのアクセスが必要となります。必要に応じてDMS は、述部を評価するために必要な列を取り出し、さらに SELECTリストの列を満たすもののうち索引からは取得できなかったものを取り出します。
つまり、Db2においてSARG
とラベルされているのは、
通常、インデックスレベルかテーブルレベルかによらず、フィルタ述語であるという事です。
Db2の実行計画に表示されている述語情報の非常に良い所は、アクセス述語のラベルを付けるだけでなく、
どの述語がSTART
やSTOP
に使われているのかまで
明示的に表示される事です。
次の例は、last_explained
ビューで
表示される全ての述語タイプを示したものです。
Explain Plan
--------------------------------------------------------------
ID | Operation | Rows | Cost
1 | RETURN | | 23550
2 | GRPBY (COMPLETE) | 1 of 96480 ( .00%) | 23550
3 | IXSCAN SCALE_SLOW | 96480 of 60299800 ( .16%) | 23544
Predicate Information
3 - START (Q1.SECTION = ?)
STOP (Q1.SECTION = ?)
SARG (Q1.ID2 = ?)
Explain plan by Markus Winand - NO WARRANTY
http://use-the-index-luke.com/s/last_explained
この出力からだと、スキャンされるインデックスの範囲が非常に
簡単に分かります。START
とSTOP
述語を
見れば良いだけです(この例だと同じになっています)。
3番目のID2
列に対する述語はSARG
とラベルされており、
単なるフィルタ述語になっています。
SARG
述語は他の処理(例、TBSCAN
)にも
現れますが、START
やSTOP
の表示があるのは
IXSCAN
だけです。START
やSTOP
が
無い事はつまり、上限あるいは下限が決まっているだけの検索だと言う事です(例、WHERE x >
?
)。IXSCAN
で
START
とSTOP
のどちらもない場合、
インデックス全体が読まれている事になります。