検索引数可能 (: sargable)とは、関係データベースにおいて、DBMSエンジンがインデックスを利用してクエリの実行を高速化できる述語や条件のこと。日本語の文脈でもSARGableのように記載されることがある[1]。この用語は、 Search ARGumentABLEの短縮形に由来する。検索引数可能でないクエリは、non-sargableクエリと呼ばれ、インデックスが効かない。

概要 編集

検索引数可能でないクエリは、通常はクエリ時間に悪影響を与えるため、クエリ最適化の一環として、それらを検索引数可能な述語に変換する。この最適化の効果は、索引のない本で特定の用語を検索するのと似ており、毎回1ページから見ていく必要があったのを、索引をつけることで特定のページにすぐにジャンプできる。

SQLクエリを検索引数可能ためには、典型的にはWHERE句に列値を操作する関数を含めるようにすることである。 検索引数可能性が問題になるのはWHERE句だけではなく、ORDER BY、GROUP BY、およびHAVING句も考慮する必要がある。一方、SELECT句には、パフォーマンスに悪影響を与えることなく、検索引数可能でない式を含めることができる。

  • 検索引数可能な演算子=, >, <, >=, <=, BETWEEN, LIKE, IS [NOT] NULL
  • 検索引数可能な演算子だが速度改善があまり見込めないもの:<>, IN, OR, NOT IN, NOT LIKE

簡単な例 編集

Microsoft SQL Serverでの文法を例に取って見てみる。

WHERE句は、通常、演算子の左側にフィールド値、演算子の右側にスカラー値または式が配置される。

以下の記述は検索引数可能ではない

SELECT * 
FROM  myTable
WHERE 11.7 < SQRT(myIntField)

myIntFieldが関数の中に埋め込まれているため、これは検索引数可能ではない。 myIntFieldに使用可能なインデックスがある場合、インデックスは利用できない。さらに、 SQRT()はmyTableのすべてのレコードで呼び出される。

検索引数可能にした書式:

SELECT * 
FROM  myTable
WHERE myIntField > 11.7 * 11.7

myIntFieldは関数に含まれておらず、myIntFieldのインデックスを活用することができるため、これは検索引数可能である。さらに、この式は、テーブル内の各レコードに対してではなく、1回だけ評価される。

関連項目 編集

脚注 編集

  1. ^ SARGableという用語は、Griffiths Selingerらが最初に導入したと言われている。ACMが発行した1979年の論文「リレーショナルデータベース管理システムにおけるアクセスパスの選択」で使われている。

参考文献 編集

  • SQL Performance Tuning by Peter Gulutzan, Trudy Pelzer (Addison Wesley, 2002) ISBN 0-201-79169-2 (Chapter 2, Simple "Searches")
  • Microsoft SQL Server 2012 Internals by Kalen Delaney, Connor Cunningham, Jonathan Kehayias, Benjamin Nevarez, Paul S. Randal (O'Reily, 2013) ISBN 978-0-7356-5856-1 (Chapter 11, The Query Optimizer)

外部リンク 編集