述部処理の要約
早期段階で評価される述部を指定することで、SQL ステートメントのパフォーマンスを向上させることができます。
処理の順序
ステージ で述部を適用する順序は、以下のとおりです。
- 索引キー列で突き合わせられる索引可能 述部が、索引のアクセス時に適用されて評価されます。
- 索引マッチング述部として選出されなかったものの、引き続き索引列を参照するステージ 1 索引スクリーニング 述部が、索引に適用されます。
- アクセスするパーティションの数を制限するために、パーティション列を参照するステージ 1 ページ範囲スクリーニング 述部が適用されます。
- データ・ページのアクセス後、他のステージ 1 述部がデータに適用されます。
- ステージ 2 述部が、返されたデータ行に適用されます。
DSN_FILTER_TABLE の STAGE 列は、述部が適用されたステージを示します。
索引可能なステージの後の各ステージ内では、以下のタイプの順に述部が適用されます。
- 等価述部 (1 つの項目しか含まれていない IN 述部、および同じ値が 2 度含まれる BETWEEN 述部を含む)
- 範囲述部と列 IS NOT NULL 述部が次に評価されます。
- その他の述部タイプ
両方の規則のセットが適用されると、述部は照会に現れる順序で 評価されます。 その順序はユーザーの指定であるため、この評価の順序を制御することができ ます。 ただし、コーディング順に関わらず、非相関のサブクエリは相関のサブクエリより先に評価されます。ただし、 Db2 がサブクエリを結合するように相関、非相関、または変換する場合を除きます。
ステージごとの述部タイプおよび処理
一般的に、複数の単純述部をOR演算子で結合することによって複合述部を形成する場合、操作の結果は、最新の評価結果として評価される単純述部と同じ特性を持ちます。 例えば、2 つの索引可能述部が OR 演算子で結合されている場合、その結果は
索引可能になります。 また、ステージ 1 述部とステージ 2 述部が OR 演算子で
結合されている場合、その結果はステージ 2 となります。
- インデックス可能およびステージ1述語 31
- 以下の述部は、索引スクリーニング中、またはステージ 1 処理時のデータ・ページ・アクセス後に、マッチング索引アクセスによって評価されます。
COL = value16, 31COL = noncol expr9, 11, 12, 15, 29, 31, 32COL IS NULL20, 21COL op value13, 31COL op noncol expr9, 11, 12, 13, 29, 31, 32value BETWEEN COL1 AND COL213, 32COL BETWEEN value1 AND value213COL BETWEEN noncol expr 1 AND noncol expr 29, 11, 12, 13, 23, 29COL BETWEEN expr-1 AND expr-26, 7, 11, 12, 13, 14, 15, 27, 29COL LIKE 'pattern'29COL IN (list)17, 18COL IS NOT NULL21COL LIKE host variable2, 29COL LIKE UPPER ('pattern')29COL LIKE UPPER (host-variable)2, 29COL LIKE UPPER (SQL-variable)2, 29COL LIKE UPPER (global-variable)2, 29COL LIKE UPPER (CAST ('pattern' AS data-type))2, 29COL LIKE UPPER (CAST (host-variable AS data-type))2, 29COL LIKE UPPER (CAST (SQL-variable AS data-type))2, 29COL LIKE UPPER (CAST (global-variable AS data-type))2, 292, 29T1.COL = T2.COLT1.COL op T2.COLT1.COL = T2 col expr6, 9, 11, 12, 14, 15, 25, 27, 29T1.COL op T2 col expr6, 9, 11 , 12, 13, 14, 15, 29COL = (noncor subq)COL op (noncor subq)28COL = ANY (noncor subq)22, 29(COL1,...COLn) IN (noncor subq)29COL = ANY (cor subq)19, 22, 29COL IS NOT DISTINCT FROM value16COL IS NOT DISTINCT FROM noncol expr9, 11, 12, 15, 29T1.COL1 IS NOT DISTINCT FROM T2.COL23, 4T1.COL1 IS NOT DISTINCT FROM T2 col expr6, 9, 11, 12, 14, 15, 29COL IS NOT DISTINCT FROM (noncor subq)SUBSTR(COL,1,n) = valueSUBSTR(COL,1,n) op valueDATE(COL) = value33DATE(COL) op value33YEAR(COL) = value33YEAR(COL) op value33
- ステージ1 インデックス不可能な述語 31
- 以下の述部は、ステージ 1 の処理中、索引スクリーニング中、またはデータ・ページ・アクセス後に評価されます。
COL <> value8, 1 1COL <> noncol expr8, 11 , 29COL NOT BETWEEN value1 AND value2COL NOT IN (list)COL NOT LIKE ' char'29COL LIKE '%char'1, 29COL LIKE '_char'1, 29T1.COL <> T2 col expr8, 11, 27, 29COL op ANY (noncor subq)22COL op ALL (noncor subq)COL IS DISTINCT FROM value8, 1 1COL IS DISTINCT FROM (noncor subq)
- ステージ 2 述部
- 以下の述部は、ステージ 2 で、データが返された後に処理される必要があります。
COL BETWEEN COL1 AND COL210value NOT BETWEEN COL1 AND COL2- 値 BETWEEN col expr と col expr 32
T1.COL <> T2.COLT1.COL1 = T1.COL23, 25T1.COL1 op T1.COL23T1.COL1 <> T1.COL23COL = ALL (noncor subq)COL <> (noncor subq)22COL <> ALL (noncor subq)COL NOT IN (noncor subq)COL = (cor subq)5COL = ALL (cor subq)COL op (cor subq)5COL op ANY (cor subq)22COL op ALL (cor subq)COL <> (cor subq)5COL <> ANY (cor subq)19(COL1,...COLn) IN (cor subq)COL NOT IN (cor subq)(COL1,...COLn) NOT IN (cor subq)T1.COL1 IS DISTINCT FROM T2.COL23T1.COL1 IS DISTINCT FROM T2 col expr8, 1 1COL IS NOT DISTINCT FROM (cor subq)EXISTS (subq)19expression = value27, 32expression <> value27expression op value27, 32expression op (subq)NOT XMLEXISTSCASE expression WHEN expression ELSE expression END = value32
- 索引可能な非ステージ 1 述部
- 以下の述部は、索引アクセス中に処理できますが、ステージ 1 で処理することはできません。
XMLEXISTS26
注:
- ESCAPE 文字が指定され、LIKE 述部で使用されている場合だけ索引可能です。 例えば、 COL LIKE '+%char' ESCAPE '+' は索引可能です。
- 変数に入っているパターンが索引可能定数である場合だけ索引可能です (例えば、variable='char%')。
- COL1 と COL2 が共に同じ表からのものであるときは、どちらか一方の
列の索引を経由するアクセスは、これらの述部では考慮されません。 ただし、以下の照会は例外です。
相関名を使用すると、照会は、1 つの表を 2 つの別々の表であるかのように 扱います。 したがって、列 C1 と C2 の索引がアクセスのときに考慮されます。SELECT * FROM T1 A, T1 B WHERE A.C1 = B.C2; - 両サイドに同じデータ・タイプが含まれている場合、述部は索引付け可能であり、ステージ 1 になります。 それ以外の場合、述部はステージ 2 です。
- 副照会がある相関値ですでに評価されていると、その副照会は 再評価しないで済む場合があります。
- 結合順序の左側の列は、 結合順序の右側の列とは異なる表になければなりません。
- expression1 または expression2 に 列を含む表は、既にアクセス済みでなければなりません。
- WHERE NOT COL = 値の処理は、WHERE COL <>値の場合と同様に処理され、以下同様に処理されます。
- noncol expr、noncol expr1、あるいは
noncol expr2 が、
以下のいずれかの形式の非列の式である場合は、述部は
索引可能ではありません。
- noncol expr + 0
- noncol expr - 0
- noncol expr * 1
- noncol expr / 1
- noncol expr CONCAT 空文字列
- COL、COL1、および COL2 は同じ列でも別の列でもかまいません。 その列は同じ表にあります。
- 次のどの一連の条件でも、
すべて述部ステージ 2 になります。
- 述部が評価される前に取得される最初の値は、BIGINTまたはDECIMAL(P,s)で、p>15および述部が評価される前に取得された2番目の値はREALまたはFLOATです。
- 述部が評価される前に取得される最初の値は CHAR、VARCHAR、GRAPHIC、または VARGRAPHIC で、述部が評価される前に取得される 2 番目の値は DATE、TIME、または TIMESTAMP です。
- 述部がステージ 1 であるが、述部が評価される前に取得される最初の値が CHAR または VARCHAR の場合に索引可能でない場合、述部が評価される前に取得される 2 番目の値は GRAPHIC または VARGRAPHIC で、述部が評価される前に取得される最初の値は Unicode 混合ではありません。
- 比較の両側がストリングの場合は、
次のどの一連の条件でも、述部ステージ 1 になりますが、索引可能にはなりません。
- 述部が評価される前に取得される最初の値は CHAR または VARCHAR で、述部が評価される前に取得される 2 番目の値は GRAPHIC または VARGRAPHIC です。
- 次の条件の両方が該当する。
- 比較の両側が CHAR または VARCHAR か、比較の両側が BINARY または VARBINARY である。
- 述部が評価される前に取得される最初の値の長さは、述部が評価される前に取得される 2 番目の値の長さよりも小さい。
- 次の条件の両方が該当する。
- 比較の両側が GRAPHIC か VARGRAPHIC である。
- 述部が評価される前に取得される最初の値の長さは、述部が評価される前に取得される 2 番目の値の長さよりも小さい。
- 次の条件の両方が該当する。
- 述部が評価される前に取得される最初の値は GRAPHIC または VARGRAPHIC で、述部が評価される前に取得される 2 番目の値は CHAR または VARCHAR である。
- 述部が評価される前に取得される最初の値の長さは、述部が評価される前に取得される 2 番目の値の長さよりも小さい。
- 比較の両側が文字列であるが、2つの側が異なるCCSIDを持つ場合、述語がステージ1であり、インデックス化されるのは、述語が評価される前に取得された最初の値がUnicodeであり、比較が注13の条件のいずれにも該当しない場合のみです。
- 以下のすべての条件に該当する場合、述部はステージ 2 です。
- col expr または noncol expr が、2 つの非列の式の積または商の整数値である
- COL が FLOAT 列または DECIMAL 列である
- COLにROWIDデータ・タイプがある場合、Db2は、索引アクセスまたは表スペース・スキャンの代わりに直接行アクセスを使用しようとします。
- COLにROWIDデータ型があり、かつ、COLにインデックスが定義されている場合、Db2は索引アクセスの代わりに直接行アクセスを使用しようとします。
- 次の条件が
該当する場合、IN リスト述部は索引可能であり、かつステージ 1 です。
- IN リストに含まれているのが単純項目のみである。 例えば、定数、ホスト変数、パラメーター・マーカー、 および特殊レジスター。
- IN リストに、集約関数もスカラー関数も含まれない。
- IN リストは、トリガーの WHEN 文節には含まれない。
- 左側の列が、15 よりも長い精度の DECIMAL である数値述部の場合、IN リスト内の 項目のいずれも FLOAT ではない。
- ストリング述部の場合、 コード化文字セット ID は、左側の列の ID と同じである。
- DATE、TIME、および TIMESTAMP 述部の場合、左側の列が DATE、 TIME、または TIMESTAMP でなければならない。
- 特定の述部は、処理中に変換される方法に応じて、索引可能であり、ステージ 1 になる場合があります。
- 述部タイプ COL IS NULL および COL IS NOT NULL は、NOT NULL として 定義された列を照会するときは、ステージ 2 述部である。
- 述部タイプが COL IS NULL で、 列が NOT NULL として定義されると、C1 は NULL にはなれないので、 表はアクセスされません。
- ANY キーワードと SOME キーワードの動作は類似しています。 ANY キーワードを指定した述部が索引付け不能でステージ 1 でない場合は、SOME キーワードを 指定した類似の述部は索引付け不能でステージ 1 ではない。
- 以下の環境のいずれかのもとでは、
述部はステージ 2 です。
- noncol expr が CASE 式である。
- noncol expr は、2 つの非列の式の積または商であり、 その積または商は整数値であり、かつ COL は FLOAT または DECIMAL 列である。
- COL IN (noncor subq) は、タイプ N アクセスの場合 のみステージ 1 になります。 それ以外の場合は、ステージ 2 です。
- 内部表が EBCDIC または ASCII 列であり、外部表が Unicode 列の場合、述部はステージ 1 であり、索引可能です。
- XMLEXISTSは、常にステージ2です。 しかし、述部でXPath式を評価するためにXML索引を使用できる場合は、同じ述部を索引可能であり、マッチング述部にすることができます。 XMLEXISTS 述部はスクリーニング述部になることはありません。
- 述部が式ベースの索引によって索引可能になる可能性があるのは、その述部が列参照の式を含むか、組み込み関数を呼び出すか、または一般式を含む場合です。
- このタイプの述部は、NULL 可能性不一致が起こりうる場合はステージ 1 ではありません。
- COL がフィールド・プロシージャーを使用して定義されている場合、述部はステージ 2 になります。
- このタイプの結合述部は、2 つの列のデータ・タイプ、長さ、およびコード化スキームが同じ場合、ページ範囲スクリーニングの対象となる可能性があります。
- 以下の述部は、右側のみに DECFLOAT データ・タイプが含まれる場合に、索引可能なステージ 1 になる可能性があります。
COL = valueCOL = noncol exprCOL op valueCOL op noncol expr
- expression に以下のいずれかのスカラー関数が含まれている場合、述部には索引付け可能性があります。
- 日付
- YEAR
- SUBSTR(サブストリングの開始値が1の場合。)
- COL は DATE、TIME、または TIMESTAMP 列です。
上記のサンプル述部では、以下の省略形および変数値が使用されています。
- 文字
- パーセント (%) や下線 (_) を表す特殊文字を含まない任意の文字ストリング
- COL
- 列名。
- コロン式
- 列式。
- cor subq
- 相関副照会
- expression
- 算術演算子、スカラー関数、集約関数、連結演算子、列、定数、ホスト変数、特殊レジスター、 または日付あるいは時刻の式を含む任意の式
- 非col式
- 非列の式であり、これは
列を含まない任意の式のことです。 この式は、算術演算子、スカラー関数、
連結記号、定数、ホスト変数、
特殊レジスター、
または日付や時刻の式を含みます。
非列の式の例は、以下のものがあります。
CURRENT DATE - 50 DAYS - noncor subq
- 非相関副照会
- :NONE.
- 演算子>、>=、<、<=、¬>、¬<のいずれか
- 述部
- 任意のタイプの述部。
- パターン (Pattern)
- パーセント (%) や下線 (_) を表す特殊文字が 先頭に付いていない 任意の文字ストリング
- SUBQ
- 相関または非相関副照会
- Tn
- 表名。
- Tn col expr
- 表 Tn 内の列を含む式。 この式は、単にその列である可能性があります。
- value
- 定数、ホスト変数、または特殊レジスター