リレーショナル データベースでは、クエリ内の条件 (または述語) は、 DBMSエンジンがインデックスを利用してクエリの実行を高速化できる場合、検索引数可能と呼ばれます。この用語は、 Search ARGument ABLEの短縮形に由来しています。これは、 IBM の研究者によって Search ARGument の短縮形として最初に使用され、単に「インデックスで検索できる」という意味になりました。1 [1] [2]
データベースクエリ オプティマイザにとって、検索引数可能はOLTPワークロードにおける重要な特性です。これは、複雑で時間のかかるコストベースの検索ではなく、単純なヒューリスティック2によるインデックスへのクエリのマッチングによって優れたクエリ プランが得られることを示唆しているためです[1]。そのため、検索引数可能なクエリを記述することが望まれることがよくあります。検索引数可能でないクエリは非検索引数クエリと呼ばれ、通常はクエリ時間に悪影響を与えるため、クエリ最適化の手順の 1 つは、非検索引数可能に変換することです。この効果は、インデックスのない本で特定の用語を検索するときに、インデックスで識別された特定のページのリストにジャンプするのではなく、毎回 1 ページ目から検索するのに似ています。
SQL クエリが検索引数不可になる一般的な状況は、列値を操作する関数を WHERE 句に含めることです。検索引数可否が問題になる句は WHERE 句だけではありません。ORDER BY、GROUP BY、HAVING 句にも影響することがあります。一方、SELECT 句には、パフォーマンスに悪影響を与えることなく、検索引数不可の式を含めることができます。
PostgreSQL などの一部のデータベース管理システムは、関数インデックスをサポートしています。概念的には、インデックスは単に値と 1 つ以上の場所との間のマッピングです。関数インデックスでは、インデックスに格納される値は、インデックスの作成時に指定された関数の出力です。この機能により、検索引数の対象が基本列式を超えて拡張されます。
- 検索引数演算子:
=, >, <, >=, <=, BETWEEN, LIKE, IS [NOT] NULL, IN - パフォーマンスをほとんど向上させない検索引数演算子:
<>, NOT, NOT IN, NOT LIKE
簡単な例
WHERE検索引数可能な句では、通常、演算子の左側にフィールド値が、演算子の右側にスカラー値または式が存在します。
検索語句検索不可:
SELECT * FROM myTable WHERE SQRT ( myIntField ) > 11.7
myIntField は関数に埋め込まれているため、これは検索引数としては使用できません。myIntField で使用可能なインデックスがあったとしても、それらは使用できません。また、myTable のすべてのレコードで が呼び出されます。
SQRT()
検索可能バージョン:
SELECT * FROM myTable WHERE myIntField > 11.7 * 11.7
これは、myIntField が関数に含まれていないため、検索引数として使用できます。これにより、myIntField で使用可能なインデックスが使用可能になります。さらに、式はテーブル内の各レコードではなく、1 回だけ評価されます。
テキスト例
WHERE...LIKE検索引数可能な句には、演算子の左側にフィールド値があり、右側に
LIKEで始まらないテキスト文字列があります。%
検索語句検索不可:
SELECT * FROM myTable WHERE myNameField LIKE '%Wales%' -- % で始まり、検索引数なし
これは検索引数ではありません。任意の位置に部分文字列を含むフィールドを見つけるには、すべての行を調べる必要があります'Wales'。
検索可能バージョン:
SELECT * FROM myTable WHERE myNameField LIKE 'Jimmy%' -- % で始まっていない、検索引数可能
これは検索引数可能です。インデックスを使用して、部分文字列で始まるすべての myNameField 値を見つけることができます 'Jimmy'。
参照
注記
- ^1 Gulutzan と Pelzer、(第 2 章、単純な「検索」)
- ^2 [3]はそのような単純なヒューリスティックの例を示しています。
外部リンク
- SQL Shack - T-SQL クエリでの検索引数式の使用方法、パフォーマンス上の利点と例
- DBA.StackExchange.com - 「SARGable」という言葉は実際には何を意味しますか?
参考文献
- ^ ab Andy, Pavlo (2023年春). 「CMU 15-721 :: Advanced Database Systems (2023年春) :: Lecture #16 Optimizer Implementation (Part 1) - Slide」(PDF) 。 2023年6月1日時点のオリジナルよりアーカイブ(PDF) 。 2024年1月25日閲覧。
- ^ Selinger, P. Griffiths; Astrahan, MM; Chamberlin, DD; Lorie, RA; Price, TG (1979)。「リレーショナル データベース管理システムにおけるアクセス パスの選択」。1979 ACM SIGMOD 国際データ管理会議議事録 - SIGMOD '79。ACM Press。p. 23。doi :10.1145 / 582095.582099。ISBN 978-0-89791-001-9。
- ^ Silberschatz, Abraham; Korth, Henry F.; Sudarshan, S. (2020).データベースシステムの概念(第7版). ニューヨーク、NY: McGraw-Hill Education. p. 773. ISBN 978-1-260-08450-4。
