2003年 9月 1日 「INDEX-only」 と ヌル・キー >> 目次 (作成日順)


 
ヌル・キー は B ツリー の アクセス・パス を排除するために使う。

 ヌル・キー とは、値が ヌル (HEX '00') である キー のことをいう。
 ヌル・キー は、インデックス の アクセス・パス (B ツリー の階層) を排除するために使う。
 したがって、データ に対して、高速な検索を実現する。

 ただし、ヌル・キー が B ツリーのなかに生成されないことが前提である。
 ヌル・キー が B ツリーのなかに生成されたら、インデックス の アクセス・パス を排除することにはならない。

 市販されている RDB のなかには、ヌル・キー を B ツリー から排除する プロダクト もあれば、排除しない プロダクト もあるので、それぞれの プロダクト ごとに調べてほしい。

 
多量 データ のなかから任意の少量 データ を入手する例。

 [ 事例 ]

 (1) 以下の 2つの テーブル を例にする。
    - 「受注 (仮契約)」 テーブル
    - 「契約」 テーブル

 (2) 「受注」の データ 件数は 6,000,000件である。

 (3) 契約されていない受注 データ を、数量の多い順に、以下の情報を表示する。
    - 受注数
    - 顧客番号

  なお、顧客に関して、顧客名称、電話番号や住所の情報を表示するのなら、顧客番号を使って、顧客 テーブル を join すればよい。



受注 (仮契約) 契約
受注NO 顧客NO(R) 受注日 受注数 契約NO 受注NO(R) 契約日  
001 01 07-28 100 0001 001 08-29  
002 05 07-28 30 0002 005 08-29  
003 01 07-29 200        
004 03 07-29 150        
005 10 07-29 45        


 
コード 体系を変更することを前提にすれば、区分 コード を定義して「INDEX-only」を使えばよい。

 データ 構造を変更する前提であれば、「受注」 テーブル のなかに、「未済・済み」 区分 コード を用意すればよい──言い換えれば、サブセット を生成すればよい。



受注 (仮契約)
受注NO 顧客NO(R) 受注日 受注数 未済・済み
001 01 07-28 100 1
002 05 07-28 30 0
003 01 07-29 200 0
004 03 07-29 150 0
005 10 07-29 45 1


 
 「未済・済み」 区分 コード の値は、B ツリー のなかで、「未済」 データ が最初にほうに収納されるように、「未済」 を 「0」 とし、「済み」 を 「1」 とすればよい。そして、以下の 「INDEX-only」 を使えばよい。

                    未済・済み (0) + 受注数 (降順) + 顧客番号

 
コード 体系を変更できないのなら、(FLAG を用意して 「INDEX-only」 を使うか、) ヌル・キー を使えばよい。

 コード 体系を変更できないのであれば、「未済・済み」 区分 コード を「未済・済み」 FLAG として、物理 テーブル のなかのみで扱い、エンドユーザ に対して表示しないようにすればよい。
 あるいは、以下のように、ヌル・キー 用の カラム を用意してもよい。



ヌル・キー 受注 (仮契約)
受注数 顧客NO 受注NO 顧客NO(R) 受注日 受注数
    001 01 07-28 100
30 05 002 05 07-28 30
200 01 003 01 07-29 200
150 03 004 03 07-29 150
    005 10 07-29 45


 
 そして、ヌル・キー 用の カラム に対して、以下の インデックス を生成すればよい。

                     受注数 (降順) + 顧客番号

 「INDEX-only」 と ヌル・キー の違いは、「INDEX-only」 では、6,000,000件の アクセス・パス を B ツリー のなかに生成するが、ヌル・キー では、(ヌル 値の キー は B ツリー から排除されて) 値を収納している キー のみが生成される、という点にある。

 どちらのやりかたが効果的・効率的であるかという点は、それぞれの具体的な適用例のなかで判断してほしい。
 一般論で言うなら、ヌル・キー は、オンライン・リアルタイム のなかで、「多量 データ のなかから、任意の少量 データ を入手する」 ために使う やりかた である。ただし、ヌル・キー が B ツリー から排除されなければ、「INDEX-only」 と同じになる点に注意されたい。




  << もどる HOME すすむ >>
  ベーシックス