ページの先頭行へ戻る
Symfoware Server V10.0.0 アプリケーション開発ガイド(共通編)

H.2.1 SCANエレメント

SCANエレメントは、データベースやソートテーブル、ワークテーブルからデータを取り出す処理単位です。データの取出し方法には、複数のアクセス方式があります。

アクセス方式

アクセス対象

1) TABLE KEY SCAN

データベースの表

2) TABLE ALL SCAN

データベースの表 ソートテーブル ワークテーブル

3) TABLE PARALLEL SCAN

データベースの表

4) INDEX KEY SCAN

インデックス

5) INDEX ALL SCAN

インデックス

6) INDEX TABLE SCAN

データベースの表とインデックス

1) TABLE KEY SCAN

データベースの表の目的のレコードを、表のクラスタキー値あるいはレコードの格納アドレスで検索するアクセス方式です。レコードの格納アドレスはTID(Tuple ID)と呼びます。

レコードの格納アドレス:

レコードのTIDでレコードを取り出します。TIDは、表の格納構造がSEQUENTIALまたはOBJECTの場合に、インデックスのデータ部に表レコードとの関係付けのために格納されています。

クラスタキー値:

表の格納構造がRANDOMの場合、クラスタキー値を作成して、目的のレコードが格納されているバケットを位置づけて、バケット中のレコード群から目的のレコードを取り出します。クラスタキー値は、RANDOM構造の表の場合に、インデックスのデータ部に表レコードとの関係付けのために格納されています。

SQL文のWHERE探索条件に表のクラスタキー値を一意に指定するような条件を指定すると、指定した条件からクラスタキー値を作成して、TABLE KEY SCAN(クラスタキー値検索)を行うことができます。


1

クラスタキー値を利用したTABLE KEY SCANができる場合(TBL1の格納構造はRANDOMで、クラスタキーを(C1,C2)とします。)

SELECT * 
 FROM TBL1
 WHERE C1 = 1................(注)
   AND C2 = 1................(注)
   注)クラスタキー値を作成してTABLE KEY SCAN
2

クラスタキー値を利用したTABLE KEY SCANができない場合(TIの格納構造はRANDOMで、クラスタキーを(C1,C2)とします。)

SELECT * 
 FROM TBL1
 WHERE C1 = 1................(注)
   AND C2 > 1................(注)
   注)条件を“=”またはIN述語で与えないと、クラスタキー値を一意に指定できません。

2) TABLE ALL SCAN

表やソートテーブルまたはワークテーブルの全レコードを取り出すアクセス方式です。

検索対象がデータベースの表である場合

データベースに物理的に格納されている順番に表の全レコードを読み込みながら、指定されたWHERE探索条件を判定して条件が成立するレコードを取り出します。

検索対象がソートテーブルである場合

ソートテーブルからソートキーの昇順となるようにレコードを取り出します。

検索対象がワークテーブルである場合

ワークテーブルに挿入した順にレコードを取り出します。

3) TABLE PARALLEL SCAN

複数のDSIに分割されたデータベースを並列に同時に検索してデータを取り出すアクセス方式です。

4) INDEX KEY SCAN

インデックスに対して、検索範囲(検索開始キーまたは検索終了キー)を指定して、その範囲にあるインデックスデータ部のレコードを検索するアクセス方式です。

インデックスの検索範囲は、SQL文に指定したWHERE探索条件から生成します。

インデックスの検索範囲の検索開始キー値、検索終了キー値の生成は、次のように行います。

なお、下表では列“C1”を先頭に持つインデックスを想定しています。:Hはホスト変数を表現しています。

条件の種別

インデックスの検索範囲

備考

比較述語 =

例 C1 = :H
  :H <= (C1) <= :H

  

比較述語 >(=)

例 C1 >= :H
  :H <(=) (C1) <= max

  

比較述語 <(=)

例 C1 <= :H
  min <= (C1) <(=) :H

  

BETWEEN述語

例 C1 BETWEEN :H1 AND :H2
  :H1 <= (C1) <= :H2

  

IN述語

例 C1 IN (:H1, :H2, ‥)
  :H1 <= (C1) <= :H1
  :H2 <= (C1) <= :H2 ‥

複数範囲となる。

LIKE述語

例 C1 LIKE :H
  :Hlow <= (C1) <= :Hhigh

“%”、“_”またはESCAPE文字までの文字列より,検索開始キー、検索終了キーを生成する。

NULL述語

例 C1 IS NULL
NULLデータ <= (C1) <= NULLデータ

NULL値データを検索する検索開始キー値、終了キー値を生成する。

同一の列に対して複数の条件をブール演算子“AND”でつないだ場合、検索範囲の検索開始キーまたは検索終了キーはデータベースアクセス前にマージされ、作成された範囲のデータのみを検索します。


1
WHERE C1 >= 10(1) AND C1 <= 20(2)の場合

インデックスの検索範囲は下図のようになる。


同一の列に対して複数の条件をブール演算子“OR”でつないだ場合、複数の検索範囲が生成され、各検索範囲のデータを検索します。

2
WHERE C1 = 10(1) OR C1 BETWEEN 20 AND 25(2)の場合

インデックスの検索範囲は下図のようになる。


複数列から構成されるインデックスの検索範囲

複数列から構成されるインデックスは、インデックスの構成列(複数の列)でインデックスのキー値を構成し、インデックスのデータ部にはこのキー値の昇順にデータが格納されています。マルチカラムインデックスの検索範囲は、この複数列で検索開始キーおよび検索終了キーを作成して、その範囲のデータを検索します。


例1

WHERE C1 BETWEEN 2 AND 3 AND C2 = 2の場合

複数列から構成されるインデックスのn番目の構成列が検索範囲として有効でない場合は、その列の取りうる最小値および最大値を補って検索範囲を作成します。

例2

WHERE C1 = 1 AND C2 BETWEEN 10 AND 20の場合

例3

WHERE C1 = 1 AND C2 > 10 AND C2 <=20 AND C3 = 2の場合

例4

WHERE C1 = 1 AND (C2 = 2 OR C2 = 3) AND C3 > 4の場合

例5

WHERE C1 > 1 AND C2 = 1 AND C3 = 1の場合

参考

インデックスキー順について

  • 第1構成列に条件が指定されないような、複数列から構成されるインデックスは、検索範囲を作成できません。

  • 比較述語“=”で条件を指定する列を優先的に先頭に配置したほうが、検索するデータ量が少なくなり、効果的です。

5) INDEX ALL SCAN

インデックスのデータ部の全データを検索するアクセス方式です。

インデックスのデータ部の全レコードを読み込み、インデックスのキー値の昇順でデータを取り出します。

6) INDEX TABLE SCAN

インデックスを範囲検索しながら、同時に対応する表のレコードも取り出すアクセス方式です。