SQL 解説書

探索条件

 
search-condition
 
|--+------+---+-predicate--+--------------------------------+-+->
   '-NOT--'   |            '-SELECTIVITY--numeric-constant--' |
              '-(search-condition)----------------------------'
 
      .--------------------------------------------------------------------------------.
      V                                                                                |
>--------+--------------------------------------------------------------------------+--+>
         '--+-AND-+---+------+---+-predicate--+--------------------------------+-+--'
            '-OR--'   '-NOT--'   |            '-SELECTIVITY--numeric-constant--' |
                                 '-(search-condition)----------------------------'
 
>---------------------------------------------------------------|
 

search-condition (探索条件) は、 特定の行について「真」、「偽」、または「不定」となる条件を指定します。

探索条件の結果は、指定した各述部の結果に、 指定した論理演算子 (AND、 OR、NOT) を適用することによって求められます。

論理演算子の指定がない場合、 探索条件の結果は指定された述部の結果になります。

AND と OR は、表 14 で定義されています。 表中の P と Q は任意の述部です。

表 14. AND と OR の真理値表
P Q P AND Q P OR Q
不定 不定
不定 不定
不定 不定
不定 不定
不定 不定 不定 不定

NOT(true) は偽、NOT(false) は真、NOT(unknown) は不定です。

括弧の中の探索条件が最初に評価されます。 評価の順序を括弧によって指定していない場合、 NOT が AND の前に適用され、AND が OR の前に適用されます。

同じ優先順位の演算子が評価される順序は、 探索条件の最適化を図るために定義されていません。

図 11. 探索条件の評価順序

探索条件の評価順序

SELECTIVITY value
SELECTIVITY 文節は、述部に指定する選択の予想パーセントを、 DB2 に知らせるときに使用します。 SELECTIVITY を指定できるのは、述部がユーザー定義述部である場合だけです。

ユーザー定義述部とは、述部が指定されている文脈の中で、 ユーザー定義関数呼び出しで構成される述部のことです。 これは、CREATE FUNCTION の PREDICATES 文節で指定した述部と一致します。 たとえば、PREDICATES WHEN=1... で関数 foo が定義される場合、 SELECTIVITY を次のように使うことができます。

	
     SELECT *
          FROM STORES
          WHERE foo(parm,parm) = 1 SELECTIVITY 0.004

この SELECTIVITY の値は、 0 〜 1 の範囲の数値リテラル値でなければなりません (SQLSTATE 42615)。 SELECTIVITY を指定しない場合、省略時値は 0.01 になります (つまり、 ユーザー定義述部は、表に含まれるすべての行の 1 パーセントを除いて、 すべての行をフィルターではじくことになります)。 この SELECTIVITY 省略時値については、 SYSSTAT.FUNCTIONS 視点の SELECTIVITY 列を更新することにより、 特定の関数用に変更することができます。 ユーザー定義述部以外の述部に SELECTIVITY 文節を指定すると、エラーが戻されます (SQLSTATE 428E5)。

ユーザー定義関数 (UDF) はユーザー定義述部として使うことができるので、 以下の場合、索引を利用するときにも使える可能性があります。

次の照会では、WHERE 文節に within UDF が指定されていて、 3 つの条件がすべて満たされているので、ユーザー定義述部であると見なされます。 (within および distance UDF の詳細は、 CREATE FUNCTION (外部スカラー)の『例』の項を参照してください。)

     SELECT *
        FROM customers
        WHERE within(location, :sanJose) = 1 SELECTIVITY  0.2

ただし、次の照会に within を指定しても、 「否定」が含まれているため、索引を利用できません。 これは、ユーザー定義述部とは見なされません。

     SELECT *
        FROM customers
        WHERE NOT(within(location, :sanJose) = 1) SELECTIVITY  0.3

次の例では、相互が特定の距離内に含まれている顧客と店を識別します。 特定の店から別の店の距離は、顧客が居住している都市の半径の範囲に基づいて計算されます。

     SELECT *
        FROM customers, stores
        WHERE distance(customers.loc, stores.loc) < CityRadius(stores.loc) SELECTIVITY 0.02

上記の照会では、WHERE 文節の述部は、ユーザー定義述部であると見なされます。 CityRadius による結果は、範囲を生成する関数に対する検索引き数として使われます。

しかし、CityRadius によって生成される結果は、 範囲を生成する関数として使われるため、上記のユーザー定義述部では、 stores.loc 列で定義した索引の拡張機能を十分に利用することができません。 したがって、UDF は customers.loc 列で定義した索引だけを利用します。


[ ページのトップ | 前ページ | 次ページ | 目次 | 索引 ]