Comments
Description
Transcript
第3章 索引設計 内容 1.索引の目的
DB2 UDB (PC&Unix) デザイン・ガイド 索引設計 第3章 索引設計 お断り:当資料は、DB2 UDB V7.1(AIX,NT,OS2) をベースに作成されています。 (C)日本IBMシステムズ・エンジニアリング(株) データシステム部 内容 1.索引の目的 2.索引の構造 3.索引の性質 4.索引の設計手順 5.その他の索引に関するトピック (C)日本IBMシステムズ・エンジニアリング(株) データシステム部 第3章( 1-2 ) <第1.00版>2001年1月 DB2 UDB (PC&Unix) デザイン・ガイド 索引設計 1.索引の目的 索引の目的 照会処理の処理効率を高める アクセス・パスでの索引の使用による効率のよいデータへのアクセス 行のユニーク性を維持する ユニーク索引 データの並び順を索引順に維持することにより、データ・アクセスの効率を向上させる クラスター索引 (C)日本IBMシステムズ・エンジニアリング(株) データシステム部 解説: 1.索引の目的 表に作成する索引は、本の索引と同様の機能を果たします。 索引の第一の目的は、データをアクセスする際の処理効率を向上させることです。余計な入出力をすることなく、最短の方法で目 的のデータにたどりつくには、索引は非常に有効です。 ユニーク索引を作成した際には、索引のキー列のユニーク性を保証する機能を使用可能です。 (C)日本IBMシステムズ・エンジニアリング(株) データシステム部 第3章( 3-4 ) DB2 UDB (PC&Unix) デザイン・ガイド 索引設計 2.索引の構造 索引の構造はBツリー構造 ページをたどっていくことにより、表のデータページのデータを見つける ルート・ページ:索引ページの最初のページ ページ番号とそのページに入っている索引列の最大値 ノン・リーフ・ページ:ページ番号とそのページに入っている索引列の最大値 リーフ・ページ:索引列の値とRID(ページ番号+行が格納されている場所のページ中のアドレス(オフセット)) ”SELECT col1 from 表 where 索引列=55”を実行した時の索引スキャン 索引 ルート・ページ ノンリーフ・ページ ページ3 列の値 列の値 30 70 100 ページ4 列の値 45 58 70 ページ番号 30 リーフ・ページ 列の値 ページ番号 ページ3 ページ4 ページ5 表 データ・ページ ページ5 ページ番号 列の値 ページ番号 55 ページ10 100 ページ10 ページ番号 列の値 52 55 58 ページ番号 RID RID RID 列の値 ページ番号 (C)日本IBMシステムズ・エンジニアリング(株) データシステム部 解説: 2.索引の構造 索引の構造は、Bツリー構造と呼ばれる階層形式です。 ルート・ページ(索引階層の最初のページ)には、下の階層の索引ページ番号と、そのページに含まれる最大のキーの値が入っ ています。下の階層には、ノン・リーフ・ページと呼ばれるページがあり、さらにその下の階層の索引ページ番号とそのページに含 まれる最大のキーの値が入っています。最後の階層には、リーフ・ページと呼ばれるページがあり、索引列の値とRIDが入ってい ます。RIDとは、索引列の値を持つ行が入っている表のデータページの番号と、その行がどの場所に格納されているかを示すポ インターです。 (C)日本IBMシステムズ・エンジニアリング(株) データシステム部 第3章( 5-6 ) DB2 UDB (PC&Unix) デザイン・ガイド 索引設計 索引ページのフリースペース 行のランダムな追加を予想して、事前に確保された空きスペース 目的: ・索引ページのスプリットの頻度を下げる ・索引の再作成の頻度を下げる 設定方法 索引作成時に各リーフ・ページのフリースペースの割合(%)をPCTFREEで指定 CREATE INDEX 索引名 ... PCTFREE 数値(%) (省略時値 10%) フリースペースが確保されるタイミング: LOADおよびREORGの時 LOADおよびREORGユーティリティーでの、索引のBuild/Rebuildフェーズでフリースペースが確保される 各索引ページの最初の行については、この値の制約を受けないが、後続の行については、フリースペースを保持し ながら、索引ページに追加される PCTFREEの値よりも、LOAD時に指定されたINDEXFREESPACEパラメーターは優先される ルート・ページ ノンリーフ・ページ リーフ・ページ 列の値 列の値 列の値 ページ番号 70 ページ4 ページ番号 ページ番号 列の値 ページ番号 58 ページ10 列の値 52 55 58 ページ番号 RID RID RID フリースペースは10% フリースペースはPCTFREEの設定 (C)日本IBMシステムズ・エンジニアリング(株) データシステム部 解説: 索引ページのフリースペース割合の設定 PCTFREEパラメーターは3/98 FixPak(FixPak3)で使用可能です。これは、CREATE INDEX ステートメントのオプションです。 フリースペースは、索引ページのスプリットを起こすことなく、索引のエントリーをINSERTするために有効です。 PCTFREEは、索引を作成する時に、フリースペースを各索引ページの何%確保するかを指定します。最初のエントリーだけは、こ の値の制限を受けません。 数値の範囲は0から99までで、省略時値は10です。もし、10以上の値が指定されていても、ノン・リーフ・ページには、10%のフ リースペースが残されます。 LOADコマンドのINDEXFREESPACE=xパラメーターは、LOAD時に、索引ページに何%のフリースペースを残すかを指定します。 数値の範囲は0から99までです。最初のエントリーだけは、この値の制限を受けません。省略時値はCREATE INDEXステートメ ントで指定された値です。INDEXFREESPACEの値は、CREATE INDEXステートメントで指定されたPCTFREE値よりも優先されま す。INDEXFREESPACEの値は、索引のリーフ・ページのみに有効な値です。 以下の場合には、フリースペースは必要ありません。 INSERT,DELETEがない 索引キーの更新がなく、固定長列のみなので更新による行のネスティングが発生しない 照会のみである (C)日本IBMシステムズ・エンジニアリング(株) データシステム部 第3章( 7-8 ) DB2 UDB (PC&Unix) デザイン・ガイド 索引設計 LOAD時に索引のフリースペースを指定可能 索引の各リーフページ内のフリースペースの割合(%)を指定 LOAD ...... MODIFIED BY INDEXFREESPACE = 数値(%) CREATE INDEXステートメントのPCTFREEで指定された値を上書き INDEXFREESPACE = 40でLOADした場合 リーフ・ページ 列の値 ページ番号 列の値 52 55 58 ページ番号 RID RID RID 各リーフページの20%が フリースペース (C)日本IBMシステムズ・エンジニアリング(株) データシステム部 解説: LOAD時に索引のフリースペースを指定可能 INDEXFREESPACEオプションは、V5.2から使用可能です。 索引のフリースペースの割合をコントロールするためには、MODIFIED BY INDEXFREESPACE=xを指定します。xは0から99まで の数値です。ページの最初のエントリーは、この値による制限に関係無く、ページに追加されます。次のエントリーは、 INDEXFREESPACEで指定したフリースペースのしきい値を越えない場合に、ページに追加されます。省略時値は、CREATE IN DEXステートメントで使用された値です。LOADで指定した値は、CREATE INDEXステートメントで指定されたPCTFREEの値 よりも優先して使用され、索引のリーフページのみに影響を与えます。LOADコマンドのINDEXFREESPACEを使用することによ り、PCTFREEで指定した値を上書きすることができます。PCTFREEの値が大抵のケースには適しているが、次に行うLOADに ついてだけは、適当でない場合などに使用します。 PCTFREEは、表にランダムにデータをINSERTするようなアプリケーションにより、索引のリーフページが頻繁にスプリットされ てしまうのを防ぐために有効です。 (C)日本IBMシステムズ・エンジニアリング(株) データシステム部 第3章( 9-10 ) DB2 UDB (PC&Unix) デザイン・ガイド 索引設計 索引ページのスプリット 索引ページが一杯になると、そのページは2つのページに分割される スプリットとは、索引ページが分割されることを指す スプリット時に分割されるデータの割合 索引ページの位置によって、分割されるデータの割合が決まる 索引のリーフ・ページが下図の様な状態であった時、 先頭ページまたは最終ページが一杯になった場合: 端になる方の新リーフ・ページが10%のデータを引き継ぎ、もう一方のリーフ・ページが90%のデータを引き継ぐ 中間ページが一杯になった場合: 50%づつの割合でデータを引き継ぐ リーフページ1 リーフページ2 リーフページ3 先頭ページ 中間ページ 最終ページ (C)日本IBMシステムズ・エンジニアリング(株) データシステム部 解説: 索引ページのスプリット 索引のリーフ・ページが満杯になった時点で、さらにそのページにデータが格納される必要があったとき、索引ページは分割さ れ、2つのリーフ・ページになります。分割されるデータの割合は、満杯になった索引ページが索引構造内でどの場所にあったか により異なります。 (C)日本IBMシステムズ・エンジニアリング(株) データシステム部 第3章( 11-12 ) DB2 UDB (PC&Unix) デザイン・ガイド 索引設計 スプリット時のデータ分割 先頭ページのリーフページ1が一杯になった時のデータ分割 先頭ページになったリーフ・ページは10% 中間ページになったリーフ・ページは90% ページ1.a ページ1から 10%のデータ ページ1.b ページ1から 90%のデータ リーフ・ページ 2 リーフ・ページ3 最終ページのリーフページ3が一杯になった時のデータ分割 最終ページになったリーフ・ページは10% 中間ページになったリーフ・ページは90% ページ3.a リーフ・ページ1 リーフ・ページ2 (C)日本IBMシステムズ・エンジニアリング(株) データシステム部 ブランク・ページです 第3章( 13-14 ) ページ3.b ページ3から ページ3から 90%のデータ 10%のデータ DB2 UDB (PC&Unix) デザイン・ガイド 索引設計 スプリット時のデータ分割 中間ページのリーフページ2が一杯になった時のデータ分割 2つのリーフページは、50%づつのデータを引き継ぐ リーフ・ページ1 ページ2.a ページ2から 50%のデータ (C)日本IBMシステムズ・エンジニアリング(株) データシステム部 ブランク・ページです 第3章( 15-16 ) ページ2.b ページ2から 50%のデータ リーフ・ページ3 DB2 UDB (PC&Unix) デザイン・ガイド 索引設計 3.索引の性質 索引の性質 3−1.ユニーク索引/非ユニーク索引 3−2.Include列つきのユニーク索引 3−3.クラスター索引/非クラスター索引 3−4.単一列索引/複合列索引 3−5.双方向索引 (C)日本IBMシステムズ・エンジニアリング(株) データシステム部 解説: 3.索引の性質 索引作成の構文(CREATE TABLE) >>-CREATE----+---------+--INDEX----索引名---------------------> '-UNIQUE--' .-,--------------------. (1) V .-ASC--. | >----ON----+-表名---------+--(-----列名--+------+----+---)-----> | (2) | '-DESC-' '-ニックネーム--' >-----+---------------------+-----------------------------------> '-SPECIFICATION ONLY--' >----*--+--------------------------------------------+----------> | .-,----------. | | (3) V | | '-INCLUDE------------------(-----列名---+---)----' .-PCTFREE 10--------. >----*--+---------+---*---+-------------------+---*-------------> '-CLUSTER-' '-PCTFREE--数値----' >-----+----------------------+--*-------------------------------> '-MINPCTUSED--数値--' .-DISALLOW REVERSE SCANS--. >----+----------------------------+---*--------------------------->< '-ALLOW REVERSE SCANS-----' (C)日本IBMシステムズ・エンジニアリング(株) データシステム部 第3章( 17-18 ) DB2 UDB (PC&Unix) デザイン・ガイド 索引設計 3−1.ユニーク索引/非ユニーク索引 ユニーク索引 索引キーとなる列の値のユニーク性を維持する データの変更時には索引キーの値についてユニーク性の検査が行われ、重複データである 場合には、アプリケーションにエラーが戻される 非ユニーク索引 索引キーとなる列の値の重複値を許す 構文 CREATE UNIQUE INDEX 索引名 ON 表名 (列名 順序) ......... 複合列索引も可能(最大16列まで) 関連するシステム・カタログ SYSCAT.INDEXESのUNIQUERULE列 U(ユニーク索引) D(重複キーを許す索引) P(基本キーに対応して自動生成された索引) (C)日本IBMシステムズ・エンジニアリング(株) データシステム部 解説: 3−1.ユニーク索引/非ユニーク索引 基本キーを作成すると、内部的に、基本キーに対応するユニーク索引が作成されます。 ユニーク索引による列にユニーク性の検査は、以下の場合に行われます。 INSERT IMPORT UPDATE LOADの場合、ユニーク性の検査はLOAD中には行われません。LOAD後、表がCHECK PENDING(検査保留)になりますので、 SET INTEGRITYコマンドにより、ユニーク性の検査を行う必要があります。 (C)日本IBMシステムズ・エンジニアリング(株) データシステム部 第3章( 19-20 ) DB2 UDB (PC&Unix) デザイン・ガイド 索引設計 3−2.Include列つきのユニーク索引 ユニーク索引の列として、ユニークではない列を含むことが可能 目的: ・索引のみのアクセスによるパフォーマンス向上 ・冗長な索引を作成しない 索引キーの一部の列については、ユニーク性を保持する ユニークではない列については、ユニーク性の検査が発生しない 作成方法: CREATE UNIQUE INDEX 索引名 ON 表名 (列名) INCLUDE (列名) 複数列の指定が可能(索引列数:16列 最大キー長:1024バイト) ユニークではない列については、索引順(ASC,DESC)の指定は無効 考慮点 必要となるディスク容量の増加 更新頻度が高いと、索引のメンテナンス負荷も増加する 関連するシステム・カタログ SYSCAT.INDEXESのCOLCOUNT列: 索引の列数 SYSCAT.INDEXESのUNIQUE_COLCOUNT列: 索引のユニークな列数 SYSCAT.INDEXECOLUSEのCOLORDER列: 索引順の指定 A (Ascending:昇順) D (Descending:降順) I (Include列なので、順番はない) (C)日本IBMシステムズ・エンジニアリング(株) データシステム部 解説: 3−2.Include列つきのユニーク索引 CREATE INDEX ステートメントの INCLUDE パラメーターは 3/98 FixPak (FixPak3)で使用可能です。 要求されたデータ全てを、表にアクセスすることなく索引から取り出すことができるアクセス・パスは、 index-only access です。 INCLUDE列を指定してユニーク索引を作成することにより、データページのアクセス頻度が軽減されます。 LOADは、INCLUDE列のある索引をサポートします。 (C)日本IBMシステムズ・エンジニアリング(株) データシステム部 第3章( 21-22 ) DB2 UDB (PC&Unix) デザイン・ガイド 索引設計 INCLUDE列つきのユニーク索引:使用例 処理するSQLステートメントの例:(employee_idに基本キーがある) SELECT employee_id, mgr_id FROM my_employee WHERE employee_id = 78379 ; INCLUDE列を使用しない例:2つの索引を作成・維持する必要あり 1.表の作成 CREATE TABLE my_employee ( employee_id integer not null, mgr_id integer, phone_no integer, hire_date date, PRIMARY KEY (employee_id) ); - db2は基本キーには自動的にユニーク索引を作成する 2.索引のみのアクセスのために、索引を作成する CREATE INDEX col_index ON my_employee (employee_id, mgr_id) ; INCLUDE列を使用する例:1つの索引だけで INDEX ONLY ACCESS 1.表の作成 CREATE TABLE my_employee ( employee_id integer not null, mgr_id integer, phone_no integer, hire_date date) ; 2.INCLUDE列つき索引の作成 CREATE UNIQUE INDEX my_index on my_employee (employee_id) INCLUDE (mgr_id) ; 3.基本キーの作成 ALTER TABLE my_employee add PRIMARY KEY (employee_id); - 既存の索引が基本キーになる (C)日本IBMシステムズ・エンジニアリング(株) データシステム部 解説: INCLUDE列つきのユニーク索引:使用例 索引col_indexは、表にアクセスすることなく、索引のみで上記の照会処理要求を満たすことができます。これをindex-only access といいます。 (C)日本IBMシステムズ・エンジニアリング(株) データシステム部 第3章( 23-24 ) DB2 UDB (PC&Unix) デザイン・ガイド 索引設計 3−3.クラスター索引/非クラスター索引 クラスター索引 INSERT時に、索引順とデータの並び順を同じにするようにデータを格納しようと試みる 用途:高いクラスター率で索引順にデータを格納することにより、順次スキャンや順次先読み の際のI/O回数が軽減され、処理効率が向上 スキャンするページ数の削減 ORDER BY や GROUP BY 節が索引列に対して指定された時に、内部ソート負荷を軽減 非クラスター索引 索引順に関係なく、追加データは最初に見つかった空きスペースに格納する 用途:1件ヒットのランダムな検索処理の場合には、非クラスター索引でも有効 関連するシステム・カタログ INSERT TO 表 VALUES ( 56, ...) SYSCAT.INDEXESのINDEXTYPE列 CLU :クラスター索引 (CLUSTER) REG :非クラスター索引 (REGULAR) クラスター索引 ノンリーフ・ページ 列の値 58 リーフ・ページ 列の値 ページ番号 ページ番号 データ・ページ 55 ページ10 列の値 52 55 58 ページ番号 RID RID RID (C)日本IBMシステムズ・エンジニアリング(株) データシステム部 解説: 3−3.クラスター索引/非クラスター索引 クラスター索引は3/98 FixPak (FixPak3)で可能になっています。 クラスター索引は、データが追加された場合に、索引キー順にデータをデータページに格納しようと制御するので、クラスター索引 のキー順による順次スキャンや、順次先読みの際に有効な索引です。逆に、ユニーク索引による1件ヒットの照会処理などについ ては、クラスター索引を作成する必要はありません。 (C)日本IBMシステムズ・エンジニアリング(株) データシステム部 第3章( 25-26 ) DB2 UDB (PC&Unix) デザイン・ガイド 索引設計 クラスター索引の使用 作成方法 CREATE INDEX 索引名 ON 表名 (列名) ...... CLUSTER 考慮点 表の空きスペースを準備しておく必要がある(ALTER TABLE 表名 ... PCTFREE 数値(%) ) ALTER TABLEステートメントのPCTFREEオプションで、表の1ページあたりのフリースペースの割合を設定すること により、データ行を索引と同じ順番に挿入することができる PCTFREEの指定がない場合には、表ページにフリースペースはとられない LOADのMODIFIED BY PAGEFREESPACE=数値(%) オプションで、PCTFREEの値を上書きしてLOADが可能 APPENDモードで作成された表にクラスター索引を作成することはできない 索引列がUPDATEされた場合、索引順に行を格納しなおすことはない クラスター率を高く維持するためには、UPDATEの代わりにDELETE/INSERTを使用する データページのフリースペース探索順 1.ターゲットページを探す 2.同一エクステントのページを探す 3.表の最後のページに追加する (C)日本IBMシステムズ・エンジニアリング(株) データシステム部 解説: クラスター索引の使用 パフォーマンスのガイドライン INSERT行の索引列の値がランダムである場合が多い表ほど、クラスター率を維持するためにより大きいPCTFREEの値が必 要です 一方、新規行の索引キーの値が、常に新しいHigh Keyの値であった場合、表のクラスター属性により、表の最後に追加され ます。他のページにフリースペースがあっても、クラスタリングには役に立ちません。この場合には、表をAPPENDモードにす ることの方が、クラスター索引や大きなPCTFREEの値よりも良い選択でしょう。 上記の話は、UPDATEにより行長が増えてしまったための、新しいオーバーフロー行についても当てはまります。 索引のPCTFREEを大きい値に設定することにより、高いクラスター性を長期間維持することができ、再編成の必要性を軽減 しますが、より多くのディスクスペースが必要となります。 APPENDモードの表とは、ALTER TABLEモードのAPPENDオプションをONに設定することにより、フリースペースの管理をせず に、追加されたデータ行は常に最終ページに追加される属性を持つ表のことを指します。 (C)日本IBMシステムズ・エンジニアリング(株) データシステム部 第3章( 27-28 ) DB2 UDB (PC&Unix) デザイン・ガイド 索引設計 クラスター索引の作成 クラスター索引の作成例 クラスター索引を作成後、PCTFREEを設定する CREATE TABLE mytab ( mycol1 integer, mycol2 char (8), mycol3 char (40) ); ALTER TABLE mytab PCTFREE 50; 高クラスター率の維持 大量の変更処理後、クラスター率を確認 表と索引についてRUNSTATS SYSCAT.INDEXESの CLUSTERRATIO あるいは CLUSTERFACTOR をチェック あるいはREORGCHKを実行 クラスター率が低い場合には、REORG REORGの作業域としてデータの2−3倍のディスク領域が必要 REORG TABLE 表名 [ INDEX 索引名 ] [ USE 一時表スペース名 ] REORG中は表に対して排他制御がとられるため、データにアクセスすることはできない 索引名を指定せずにREORGした場合、クラスター索引が存在すれば、そのクラスター索引順にREORGされる UPDATEについては、クラスター順は維持されない 可能であれば、DELETE/INSERTを使用する (C)日本IBMシステムズ・エンジニアリング(株) データシステム部 解説: クラスター索引の作成 SQLステートメントがソート処理を必要としている場合(例えば、ORDER BY,GROUPE BY,DISTINCT)で、そのソートに対応した索 引がある場合でSも、データベース・マネージャーが索引を選択しない場合もあります。これは、以下の場合に起こり得ます。 索引クラスター率が低い(SYSCAT.INDEXESのCLUSTERRATIOとCLUSTERFACTOR列を参照) 表が小さいので、表をスキャンするコストが低く、アンサーセットをメモリー内でソートできる表にアクセスするための索引があ る クラスター索引を作成後、再編成をするか、ソートしたデータをロードすることをお勧めします。一般的に、一つの表は1つの索引 についてのみクラスター化が可能です。クラスター索引により、表の物理的な格納順がある特定の順に、可能な限り維持され、 RUNSTATSにより収集されるCLUSTERRATIOあるいはCLUSTERFACTORの値も高く維持されます。 表へのLOADあるいはREORGを実行する前に、PCTFREEを使用してALTER TABLEを行うべきです。クラスター率を維持する ためには、追加行用に、各データページには使用可能なスペースが必要です。スペースが使用可能であれば、追加されたを、既 存のデータに対してクラスター順に格納することができます。使用可能なスペースを残すには、まず最初に表を作成し、その次に PCTFREEパラメーターを指定したALTERステートメントを発行します。 UPDATEによる更新については、クラスタリングされません。もしクラスター索引のキーの値が変わるような更新処理が行われて も、その行は、クラスター順を維持するために他のページに移されることはありません。クラスター順を維持するためには、 UPDATEよりもDELETEとINSERTを使用します。 (C)日本IBMシステムズ・エンジニアリング(株) データシステム部 第3章( 29-30 ) DB2 UDB (PC&Unix) デザイン・ガイド 索引設計 3−4.単一列索引/複合列索引 単一列索引 索引キーの列が1つのみの索引 複合列索引 索引キーの列が、複数列からなる索引 複合列索引作成の考慮点 CREATE INDEXで指定する索引列の最初の列は、最もユニーク性が高く、検索条件として使 用頻度が最も高い列を指定する 複合列索引に含まれる列は、検索条件で頻繁に一緒に使用される列の組合わせであること 複合列索引(列1、列2、列3)が、アクセス・パスの候補になりうる例 WHERE 列1=値 and 列2=値 and 列3=値 WHERE 列1=値 and 列2=値 WHERE 列1=値 複合列索引(列1、列2、列3)が、アクセス・パスの候補にならない例 WHERE 列2=値 and 列3=値 WHERE 列2=値 WHERE 列3=値 (C)日本IBMシステムズ・エンジニアリング(株) データシステム部 ブランク・ページです 第3章( 31-32 ) DB2 UDB (PC&Unix) デザイン・ガイド 索引設計 3−5.双方向索引 双方向索引(Reversal索引) CREATE INDEX時に指定した索引順(ASC,DESC)の逆順のスキャンにも使用可能 目的 逆順の索引を作成する必要がない(ディスク容量の削減、メンテナンス負荷の削減) 逆順読みをするために、内部的に一時表を作成する必要がない MINおよびMAX関数の実行が容易に 作成方法 CREATE INDEX 索引名 ..... ALLOW REVERSE SCANS 省略時値は、DISALLOW REVERSE SCANSで、一方向のスキャンにのみ使用可能 SYSCAT.TABLESのREVERSE_SCANS列 : Y=Reversal索引 N=Non-Reversal索引 双方向索引 考慮事項 列の値 58 V6以前の索引はサポートされない リーフ・ページ 索引メンテナンスのオーバーヘッド 列の値 ページ番号 デッドロック発生の可能性 オプチマイザーは前方向スキャンを選択する傾向がある ページ番号 ページ10 列の値 52 55 58 ページ番号 RID RID RID (C)日本IBMシステムズ・エンジニアリング(株) データシステム部 解説: 3−5.双方向索引 既存の、一方向のみに使用する索引は引き続きサポートされ、必ずしも移行する必要はありません。しかし、ユーザーが双方向 索引に変更したい場合には、索引を再作成する必要があります。 省略時値(DISALLOW REVERSE SCANS)では、索引の作成時にその索引は前方向のスキャン、すなわち定義された順でのス キャンのみをサポートするように設定されます。 索引作成時にALLOW REVERSE SCANSを指定することにより、索引は、前方向と後方向のどちらの向きのスキャンも使用 可能になります。DB2 UDBは索引の最後のキーを取り出すことができます。 ユーザーは昇順と降順の索引を作成するために、同じ列に対して2つの索引を作成せずすみます。また、索引の最大値、最小値 を容易に検索することができます。 昇順では、索引のリーフページを左から右へたどります。双方向索引は双方向にポイントする、リーフ・ポインターを持っていま す。これにより、双方向索引を前から後、後から前へスキャンすることが可能です。 後ろ向き、あるいは前向きのポインターは、1つの索引リーフ・ページにあるポインターです。もし、リーフ・ページが左に無い場合 (つまり最初のリーフ・ページの場合)には、後ろ向きのポインターには、NULL値が入っています。後ろ向きのスキャンには、後ろ 向きにつけられたリーフ・ポインターをたどって、索引のリーフ・ページを右から左へスキャンします。 (C)日本IBMシステムズ・エンジニアリング(株) データシステム部 第3章( 33-34 ) DB2 UDB (PC&Unix) デザイン・ガイド 索引設計 解説: 3−5.双方向索引 <テスト1:双方向索引を使用した場合> テスト内容 ”CREATE INDEX emp3ix on employee (empno ASC) ALLOW REVERSE SCANS"で索引を作成後、 降順を指定した照会を実行時のアクセス・パスの確認(dynexplnを使用) dynexplnの出力結果 SQL Statement: select empno from employee3 order by empno desc Estimated Cost = 124 Estimated Cardinality = 2240 Access Table Name = UDBV61.EMPLOYEE3 ID = 2,15 | #Columns = 1 | Scan Direction = Reverse <= REVERSE SCANを行っている | Index Scan: Name = UDBV61.EMP3IX ID = 1 | | Index Columns: | | | 1: EMPNO (Ascending) | | #Key Columns = 0 | | | Start Key: Beginning of Index | | | Stop Key: End of Index | | Index-Only Access | | Index Prefetch: None | | | Return Data to Application | | | | #Columns = 1 | Lock Intents | | Table: Intent Share | | Row : Next Key Share Return Data Completion End of section (C)日本IBMシステムズ・エンジニアリング(株) データシステム部 解説: 3−5.双方向索引 <テスト2:双方向索引を使用しない場合> テスト内容 ALLOWS REVERSE SCANSオプションなしで昇順の索引を作成後、降順を指定した照会を実行時のアクセス・パスの確認(dynexplnを使用) dynexplnの出力結果 SQL Statement: select empno from employee3 order by empno desc Estimated Cost = 152 Estimated Cardinality = 2240 Data Stream 1: Evaluate at Open | Not Piped | Access Table Name = UDBV61.EMPLOYEE3 ID = 2,15 | | #Columns = 1 | | Index Scan: Name = UDBV61.EMP3IX ID = 1 | | | Index Columns: | | | | 1: EMPNO (Ascending) | | | #Key Columns = 0 | | | | Start Key: Beginning of Index | | | | Stop Key: End of Index | | | Index-Only Access | | | Index Prefetch: None | | | | Insert Into Temp Table ID = t1 <= 一時表にデータをINSERTしている | | | | | #Columns = 1 | | Lock Intents | | | Table: Intent Share | | | Row : Next Key Share | Temp Table Completion ID = t1 End of Data Stream 1 Access Temp Table ID = t1 | #Columns = 1 | Scan Direction = Reverse <= 一時表をReverseスキャンしている | Relation Scan | | Prefetch: Eligible | Return Data to Application | | #Columns = 1 Return Data Completion (C)日本IBMシステムズ・エンジニアリング(株) データシステム部 第3章( 35-36 ) DB2 UDB (PC&Unix) デザイン・ガイド 索引設計 4.索引の設計手順 手順 4−1.基本的な索引候補の検討 4−2.追加の索引候補の検討 4−3.索引数の検討 4−4.索引候補の取捨選択 4−5.その他の検討事項 4−6.索引の物理設計 4−7.索引の検証 4−8.索引が有効利用されるために 手順4−1については、データの意味から決定可能であり、外部設計後に可能な作業 手順4−2以降については、具体的なSQL文を元に作業 パフォーマンス改善を目的とし、内部設計から等号テストの局面まで、繰り返し行う必要がある (C)日本IBMシステムズ・エンジニアリング(株) データシステム部 ブランク・ページです 第3章( 37-38 ) DB2 UDB (PC&Unix) デザイン・ガイド 索引設計 4−1.基本的な索引候補の検討 1.ユニーク索引が必要か ユニーク性の維持が必要な場合:ユニーク索引 参照の整合性が必要な場合:基本キー CREATE TABLE実行時に、自動的に基本キーに対する昇順のユニーク索引が作成される 索引名 : SQL+タイムスタンプ+番号 索引スキーマ: SYSIBM 2.外部キーに索引をつける 結合列になる可能性が高い列に索引があると、処理効率は良い (C)日本IBMシステムズ・エンジニアリング(株) データシステム部 解説: 4−1.基本的な索引候補の検討 まず、ユニーク索引が必要かどうかを検討します。ユニーク性を維持しなければならない列が存在するのであれば、ユニーク索引 が必要です。 基本キーの必要性を検討します。他の表の列と整合性を保たなければならない、マスターとなる列が存在するのであれば、表に 基本キーを設定します。基本キーの設定は、表の作成(CREATE TABLE)時に指定するか、または、表の変更(ALTER TA BLE)で指定します。 外部キーがある場合、検索条件の結合列となる可能性が高いため、索引の候補になります。 (C)日本IBMシステムズ・エンジニアリング(株) データシステム部 第3章( 39-40 ) DB2 UDB (PC&Unix) デザイン・ガイド 索引設計 4−2.追加の索引候補の検討 条件句(WHERE句に現れる述語)の中で頻繁に使用される列について 検討する 結合列 探索条件の列 ANDで結ばれた等号述語 範囲指定の述語(BETWEEN,不等号述語) ソート列(DISTINCT、ORDER BY、GROUP BYで指定された列) 索引のみのアクセスを目的とした索引 INCLUDE列つきの索引 (C)日本IBMシステムズ・エンジニアリング(株) データシステム部 解説: 4−2.追加の索引候補の検討 さらに、その他の索引候補を検討します。候補になる列は、条件節での登場回数が多い列です。また、ソートの対象となる列も候 補になります。 (C)日本IBMシステムズ・エンジニアリング(株) データシステム部 第3章( 41-42 ) DB2 UDB (PC&Unix) デザイン・ガイド 索引設計 4−3.索引数の検討 索引数の目安:表あたり5個以下が望ましい むやみに索引を作成することは、ディスクを無駄に消費し、負荷を増やすことになる オンラインでの更新処理環境: 1−2個 照会のみの環境: 5個以上作成してもよい オンラインの更新処理と照会処理の混在した環境: 2−5個 更新処理時には索引のメンテナンスが必要となり、負荷が発生する INSERT処理では、索引列の追加処理が発生 DELETE処理では、索引列の削除処理が発生 索引列に対するUPDATE処理では、索引列の変更処理 索引のスプリット処理 その他の負荷 索引のある表へのDELETE/INSERTでは、Next Key Lockが取られる クラスター索引がある表へのINSERTは、索引順を極力保持するようにデータを格納する ディスク・スペース使用量の増加 LOAD、REORG時の索引の再作成の負荷 索引の追加によりプログラムのPREPARE時間が増加 静的SQLではBIND時、動的SQLでは実行時の時間が増加する 検討すべきアクセスパスの組み合わせが増加する (C)日本IBMシステムズ・エンジニアリング(株) データシステム部 解説: 4−3.索引数の検討 索引数が増えると、索引のメンテナンス負荷が高くなり、処理効率が低下します。従って、トランザクションの内容により、索引数を 制限して作成する必要があります。 (C)日本IBMシステムズ・エンジニアリング(株) データシステム部 第3章( 43-44 ) DB2 UDB (PC&Unix) デザイン・ガイド 索引設計 4−4.索引候補の取捨選択 索引の作成を避けた方がよい列 可変長列 索引のメンテナンスの負荷が高い COLCARD列の値が小さい(重複値の多い)列 SYSCAT.COLUMNSのCOLCARD列: ユニークな値の数 ごく小さい表の列 アクセス・パスの決定時に、索引が有効とみなされず、表スキャンになる可能性が高い 複合列索引の考慮点 複合列索引の全ての列が等号で使用されるものは有効 FULLKEYCARDが大きいものは有効 SYSCAT.INDEXES(FULLKEYCARD):列全体でユニークな値の数 FIRSTKEYCARD,FIRST2KEYCARD,FIRST3KEYCARD,FIRST4KEYCARDが大きいものは有効 SYSCAT.INDEXES(FIRSTKEYCARD):1列目のユニークな値の数 索引列は、最も頻繁に等号で指定される列か、最もユニーク性の高い列を順に指定する 最初の索引列で結果行を大幅に絞り込める索引は、利用されやすい 完全にマッチングする索引を優先する (例)索引1(col1,col2,col3) と 索引2(col1,col2)がある場合で、条件がcol1=x and col2=x であれば索引2を優先 ・索引2はFULLKEYCARDが有効であり、かつ、キー長が短いのでバッファーヒット率が高い (C)日本IBMシステムズ・エンジニアリング(株) データシステム部 解説: 4−4.索引候補の取捨選択 FIRSTKEYCARD,FIRST2KEYCARD,FIRST3KEYCARD,FIRST4KEYCARDが大きいものは有効 SYSCAT.INDEXES(FIRSTKEYCARD):1列目のユニークな値の数 SYSCAT.INDEXES(FIRST2KEYCARD):1、2列目の組み合わせでユニークな値の数 SYSCAT.INDEXES(FIRST3KEYCARD):1、2、3列目の組み合わせでユニークな値の数 SYSCAT.INDEXES(FIRST4KEYCARD):1、2、3,4列目の組み合わせでユニークな値の数 (C)日本IBMシステムズ・エンジニアリング(株) データシステム部 第3章( 45-46 ) DB2 UDB (PC&Unix) デザイン・ガイド 索引設計 4−5.その他の検討事項 索引用の表スペース 索引用の表スペースを作成する 表データとは別の物理ディスクに配置することによる並列I/Oが期待できる 索引だけ早いディスクに格納することができる 索引用の表スペースとして指定可能なのは、DMSのREGULAR表スペースのみ 索引用の表スペースに対するバッファープールを作成する 索引をメモリー上に保持し、バッファーヒットさせたい場合 索引用の表スペースはDMS表スペース(JFS)にする AIXファイルシステムのキャッシュが使用可能 索引順を維持する クラスター索引により索引順を維持する REORGにより定期的に索引順を維持する ユニーク索引の列による1件検索の場合には、クラスター率が低くても問題はない RUNSTATSの実行 現時点の統計情報に更新することにより、現状で最適なアクセス・パスが選択される(動的SQLの場合) RUNSTATSをAND INDEXESオプションつきで実行する RUNSTATSをWITH DISTRIBUTIONオプションつきで実行し、非一様分布統計情報を収集してみる (C)日本IBMシステムズ・エンジニアリング(株) データシステム部 解説: 4−5.その他の検討事項 策引データを策引用の表スペースに格納するためには、表の作成(CREATE TABLE)時に、その表に対して作成された索引 のデータをどの表スペースに格納するかを明示的に指定します。 CREATE TABLE 表名 (COL1 INTEGER, .......) IN 表の表スペース名 INDEX IN 索引の表スペース名 索引が作成されている索引用の表スペースをDROPすることはできません。DROP時に、関連するデータベース・オブジェクトが 存在するためにDROPが不可能である旨のエラー・メッセージが戻されます。この場合、索引を全てDROP後に、表スペースをD ROPするか、または、DROP TABLESPACE文で、関連する表スペースを全て指定することにより、表スペースをDROPする ことが可能です。 (C)日本IBMシステムズ・エンジニアリング(株) データシステム部 第3章( 47-48 ) DB2 UDB (PC&Unix) デザイン・ガイド 索引設計 4−6.索引の物理設計 CREATE INDEXの構文 >>-CREATE----+---------+--INDEX----索引名---------------------> '-UNIQUE--' .-,--------------------. (1) V .-ASC--. | >----ON----+-表名---------+--(-----列名--+------+----+---)-----> | (2) | '-DESC-' '-ニックネーム--' >-----+---------------------+-----------------------------------> '-SPECIFICATION ONLY--' >----*--+--------------------------------------------+----------> | .-,----------. | | (3) V | | '-INCLUDE------------------(-----列名---+---)----' .-PCTFREE 10--------. >----*--+---------+---*---+-------------------+---*-------------> '-CLUSTER-' '-PCTFREE--数値----' >-----+----------------------+--*-------------------------------> '-MINPCTUSED--数値--' .-DISALLOW REVERSE SCANS--. >----+----------------------------+---*--------------------------->< '-ALLOW REVERSE SCANS-----' (C)日本IBMシステムズ・エンジニアリング(株) データシステム部 解説: 4−6.索引の物理設計 UNIQUE ユニーク索引を作成する 列名 索引列を指定する。最大16列まで指定可能。指定された列の長さ属性の合計が1024バイト(タイプ付き表の場合には102 0バイト)を越えてはならない。 LONG VARCHAR,LONG VARGRAPHIC、LOB、DATALINKデータ・タイプは、索引列にはできない。 ASC、DESC 索引の順序で、ASCは昇順、DESCは降順。 INCLUDE INCLUDE列つきの索引を作成する際の、列を指定する CLUSTER クラスター索引を作成する。1表につき1つのクラスター索引を作成可能。また、APPENDモードで作成された表にクラスター 索引を作成することはできない。 PCTFREE(指定可能範囲0−99。省略時値10%) 索引作成時に、索引のリーフ・ページに何パーセントのフリースペースを残すかを数値(%)で指定する。ノン・リーフ・ページに ついては、10%のフリースペースがとられる。 MINPCTUSED(指定可能範囲0−99。省略時値は0。設定する場合には、パフォーマンスの観点から50以下の設定を推奨) 索引のオンラインREORGを行う場合に、索引のリーフ・ページの使用率を指定する。この値が使用率の最小値となり、使用 率がこの値以下になった場合に、索引のオンラインREORG(再編成)が自動的に行われ、隣のページをマージされた後、空 のページは解放される。 DISALLOW REVERSE SCANS/ALLOW REVERSE SCANS DISALLOW REVERSE SCANS(省略時値):索引作成時に指定した順のスキャンのみ可能 ALLOW REVERSE SCANS:リバース・スキャンも可能 (C)日本IBMシステムズ・エンジニアリング(株) データシステム部 第3章( 49-50 ) DB2 UDB (PC&Unix) デザイン・ガイド 索引設計 4−7.索引の検証 EXPLAINツールを使用して、索引が利用されているかを確認 dynexpln db2expln CC(Control Center)のVisual Explain EXPLAINツールの使用方法 静的SQL(パッケージ)の場合: db2explnコマンド 構文: db2expln -d データベース名 -c 作成者ID -p パッケージ名 -o 出力ファイル名 ヘルプの画面出力: db2expln -h db2explnのみを打鍵して実行した場合には、プロンプトが画面表示され、対話式に実行が可能 動的SQLの場合: dynexplnコマンド 構文: dynexpln -d データベース名 -q SQL文 -f 入力ファイル名 -g EXPLAINグラフの表示 -o 出力ファイル名 ヘルプの画面出力: dynexpln -h dynexplnのみを打鍵して実行した場合には、プロンプトが画面表示され、対話式に実行が可能 DYNEXPLN_OPTIONS環境変数で、PREPオプションを設定することが可能 dynexplnはDYNEXPLN_OPTIONS環境変数で指定されたPREPオプションを使用して、アクセス・パスを決定する (例)export DYNEXPLN_OPTIONS="QUERYOPT 5 ISOLATION RS" (C)日本IBMシステムズ・エンジニアリング(株) データシステム部 解説: 4−7.索引の検証 db2explnコマンドのヘルプ・テキスト出力:db2expln -h db2expln [-c <creator>] [-d <dbname>] [-e <escape>] [-g] [-i] [-l] [-t|-o <outfile>] [-p <pname>] [-s <sectnbr>] [-u <user> <pw>] [-h|-?] Input Fields: -c <creator> = package qualifier -d <dbname> = database name containing packages -e <escape> = escape character for LIKE predicate -g = show optimizer plan graphs -h = help -i = show operator ID numbers -l = respect package name case -o <outfile> = name of output file -p <pname> = package name -s <sectnbr> = section number of package (use zero for all sections) -t = terminal output desired -u <user> <pw> = user ID and password for connecting to database -? = help dynexplnコマンドのヘルプ・テキスト出力:dynexpln -h dynexpln [[-d <database>] [-f <input file>] [-g] [-i] [-t|-o <output file>] [-q <SQL statement>] [-u <userid> <password>] [-z <delimiter>]] Input fields: -d <database> = database name to connect to -f <input file> = name of file containing SQL statements to describe -g = show optimizer plan graphs -h = help -i = show operator ID numbers -o <output file> = name of output file -q <SQL statement> = SQL statement(s) to describe -t = terminal output desired -u <userid> <password> = userid and password for connecting to database -z <delimiter> = character used to delimit SQL statements (default is no delimiter) -? = help (C)日本IBMシステムズ・エンジニアリング(株) データシステム部 第3章( 51-52 ) DB2 UDB (PC&Unix) デザイン・ガイド 索引設計 アクセス・パスの確認 -例db2explnコマンドによるパッケージのEXPLAIN出力 Package Name = UDBV61.STATICES Prep Date = 2000/01/07 Prep Time = 15:58:15 Bind Timestamp = 2000-01-07-16.25.43.231864 Isolation Level = Read Stability Blocking = Block Unambiguous Cursors Query Optimization Class = 5 Partition Parallel = No Intra-Partition Parallel = No Function Path = "SYSIBM", "SYSFUN", "UDBV61" ------------------- SECTION --------------------------------------Section = 1 SQL Statement: SELECT MGRNO INTO :H00001 FROM department WHERE deptno = 'A00' Estimated Cost = 25 Estimated Cardinality = 1 Access Table Name = UDBV61.DEPARTMENT ID = 3,7 | #Columns = 2 | Single Record | Index Scan: Name = UDBV61.DEPTIX ID = 1 | | Index Columns: | | | 1: DEPTNO (Ascending) | | #Key Columns = 1 | | | Start Key: Inclusive Value | | | | 1: 'A00' | | | Stop Key: Inclusive Value | | | | 1: 'A00' | | Data Prefetch: Eligible | | Index Prefetch: None | Lock Intents | | Table: Intent Share | | Row : Next Key Share | Return Data to Application | | #Columns = 1 Return Data Completion End of section 索引スキャンの索引名 索引スキャンの索引列名 索引列への検索条件 (C)日本IBMシステムズ・エンジニアリング(株) データシステム部 解説: アクセス・パスの確認 -例Visual Explainの例 Control Centerの「パッケージ」の一覧表示から起動 アクセス・パスを図で表示 (C)日本IBMシステムズ・エンジニアリング(株) データシステム部 第3章( 53-54 ) DB2 UDB (PC&Unix) デザイン・ガイド 索引設計 4−8.索引が有効利用されるために CREATE INDEXのタイミング LOADの前 ユニーク索引がある場合、ユニーク性の検査がLOAD時に行われる 索引作成後にLOADする方が、LOAD後に索引を作成するよりも速い 大量のIMPORT後 より有効な索引列が見つかった時 DROP INDEXのタイミング 索引が使用されていないことが判明した時 EXPLAINによる確認 SYSCAT.PACKAGEDEP表 BTYPE列:各パッケージが使用するデータベース・オブジェクトの種類(T=表、I=索引、A=別名、V=視点、F=関数) BNAME列:各パッケージが使用するデータベース・オブジェクトの名前 PKGNAME BINDER BTYPE PGM01 DB2V61 T PGM02 DB2V61 I BNAME EMPLOYEE IXEMPNO RUNSTATSのタイミング 表のデータがLOADされ、適切な索引が作成されたとき 表のデータがREORGされた時 表および索引のデータの10−20%がUPDATE/DELETE/INSERTされた時 アプリケーションをBINDする前 (C)日本IBMシステムズ・エンジニアリング(株) データシステム部 解説: 4−8.索引が有効利用されるために LOADの前に索引作成を行っておいたほうが、LOAD後に索引を作成した場合と比較すると、合計時間が短くてすみます。また、 事前にユニーク索引を作成しておいた場合には、LOAD時にユニーク性の検査が行われます。 LOADの前に索引を作成しておく場合には、索引を作成するための一時領域を確保しておく必要があります。メモリー領域として は、SORTHEAP DB CFGに設定された容量のソート領域が使用されます。また、ディスク領域としては、一時表スペースが使 用されます。 索引が有効に活用されているかを確認し、使用されていない場合には、DROPする必要があります。索引が存在することによる メンテナンス負荷を軽減するためです。静的SQLプログラムについては、SYSCAT.PACKAGESで確認します。また、動的SQ Lプログラムについては、EXPLAINツールで確認します。 RUNSTATSは、表のデータが大きく変化した場合に、統計情報を最新の状態に更新するために実行します。動的SQLは、動的 にBINDを実行するため、RUNSTATSで統計情報を変更することによりアクセス・パスが変わる可能性があります。 (C)日本IBMシステムズ・エンジニアリング(株) データシステム部 第3章( 55-56 ) DB2 UDB (PC&Unix) デザイン・ガイド 索引設計 5.その他の索引に関するトピック 5−1.オンライン索引再編成 - MINPCTUSED 5−2.索引作成のSMP対応 5−3.ダイナミック・ビットマップ・インデックス 5−4.インデックス・アドバイザー (C)日本IBMシステムズ・エンジニアリング(株) データシステム部 ブランク・ページです 第3章( 57-58 ) DB2 UDB (PC&Unix) デザイン・ガイド 索引設計 5−1.オンライン索引再編成 - MINPCTUSED 格納されたデータ量をしきい値にし、リーフ・ページを自動的に再編成 利点 索引の再作成の頻度と管理作業時間を軽減 ディスク・スペースの有効利用 指定方法 CREATE INDEX........MINPCTUSED 数値(%) MINPCTUSED: オンライン索引再編成を行う、しきい値(単位は%)を設定 リーフ・ページの使用率がしきい値以下になると、オンライン索引再作成が自動実行される 50(%)以下の値を推奨(省略時値:ゼロ、オンライン索引再編成を行わない) リーフ・ページ 列の値 関連するシステム・カタログ 52 55 ページ番号 RID RID 列の値 58 60 ページ番号 RID RID SYSCAT.INDEXESのMINPCTUSED列 CREATE INDEX時に指定したしきい値が入る MINPCTUSED = 50 考慮点 リーフ・ページ 列の値 V6以降の索引のみサポート 解放された索引ページは、同一表の索引で使用可能 52 55 58 60 ページ番号 RID RID RID RID 列の値 ページ番号 (C)日本IBMシステムズ・エンジニアリング(株) データシステム部 解説: 5−1.オンライン索引再編成 - MINPCTUSED オンライン索引再作成はV6.1で使用可能になりました。これにより、索引キーの削除後に、索引ページの空きスペースを解放す ることができるようになりました。このアルゴリズムは、ユーザーがCREATE INDEXをMINPCTUSEDオプションで定義したし きい値に基づきます。2つの隣り合う索引ページをチェックし、もししきい値が満たされていれば、データベースを止めることなし に、2つのページを再編成します。 既存の索引について、この機能によりオンラインで再編成を行いたい場合には、一度削除した後、MINPCTUSEDを指定して再 編成する必要があります。 MINPCTUSEDの値は0から99の間の値に設定します。この値が再編成のしきい値、つまり、隣の索引リーフ・ページとマージし ない、索引ページあたりの使用スペースの最小の割合です。この機能の目的は、2つの隣り合う索引リーフ・ページをマージする ことなので、MINPCTUSEDの推奨値は、50より小さい値です。MINPCTUSEDの値が0である場合、これは省略時の値です が、オンライン再編成を行わないことを意味します。 オンライン索引再編成後に解放された索引リーフ・ページは、再利用可能です。けれども、解放されたページは同じ表の他の索引 についてのみ利用することが可能です。表全体の再編成の場合、DMS表スペースについては、他のオブジェクトに関して、ペー ジが解放されます。SMS表スペースについては、ディスク・スペースが解放されます。 オンライン索引再編成後でも、索引ノン・リーフ・ページは解放されません。けれども、表全体の再編成を実行することにより、索 引は可能な限り小さく作成されます。リーフおよびノン・リーフ・ページ数の数は、索引の階層と同様に削減されます。 (C)日本IBMシステムズ・エンジニアリング(株) データシステム部 第3章( 59-60 ) DB2 UDB (PC&Unix) デザイン・ガイド 索引設計 5−2.索引作成のSMP対応 索引作成時には、SMPマシンにおいてCPU並列処理が可能 索引作成(CREATE INDEX)時 基本キー、ユニーク制約を表へ追加した時 内部的に索引が生成される 表の再編成(REORG TABLE)実行時 考慮点 intra_parallel DBM CFG = YESの場合には、索引作成時のデータのスキャンおよびソートに関 して、複数CPUによる並行処理が行われる SMPマシンの場合には、省略時はYES indexsort DB CFG = NOの場合には、複数CPUの利点はない indexsort DB CFG: 索引作成時に索引キーのソートを行うかどうかをコントロールする構成パラメーター 省略時はYES (C)日本IBMシステムズ・エンジニアリング(株) データシステム部 解説: 5−2.索引作成のSMP対応 SMPマシンにおける索引作成では、表データを読み取り、ソートする処理について、複数CPUを使用します。 SMPマシンにDB2を導入した場合には、自動的にintra_parallel DBM CFGがYESに設定されます。 索引作成についてのみですが、INTRA_PARALLEL = YESになっていた場合、MAX_QUERYDEGREEの値に関係な く、(SMPで使用可能なCPUの数+1)のCPUが使用されます。”SMPで使用可能なCPUの数”の値の最大値は6です。 索引作成時に、複数CPUが使用されるかについては、動的に決定されます。 INTRA_PARALLEL = NOであれば、索引作成に複数CPUは使用されません。 (C)日本IBMシステムズ・エンジニアリング(株) データシステム部 第3章( 61-62 ) DB2 UDB (PC&Unix) デザイン・ガイド 索引設計 5−3.ダイナミック・ビットマップ・インデックス DB2は現在、ビットマップ・インデックスはサポートしていない ビットマップ・インデックスとは 各キーをビット表現で作成し、索引にビット形式で保存する 索引のディスク容量ははるかに小さくなる スター・ジョインの際に動的にビットマップ・インデックスを生成 AND 述部でのみ働く ANDで結ばれた列には索引が作成されていること ダイナミック・ビットマップ・インデックス・アンディング(DBIA)のテクノロジーを使用 一時的に自動作成されるもので、恒久的にディスクに保存されるものではない スター・ジョイン ジョインのアクセス・パスの1つ 大きな表と複数の小さな表の結合条件で、結合列に索引がある場合に選択されうるパス 小さい 表 小さい 表 大きな表 小さい 表 (C)日本IBMシステムズ・エンジニアリング(株) データシステム部 ブランク・ページです 第3章( 63-64 ) DB2 UDB (PC&Unix) デザイン・ガイド 索引設計 ダイナミック・ビットマップ・インデックスのしくみ DBIA(Dynamic Bitmap Index Anding)の例 SELECT COL1,.... from fact, dem where fact.color=dem1.color and fact.size=dem2.size and fact.price=dem3.pride ... fact.color = dem1.color 10,RED 33,BLUE 34,RED 222,RED dem1表 col1 100 200 300 999,RED color RED RED RED dem2表 col1 1 2 3 size Small Small Small RIDをハッシュ 1 11 fact.size = dem2.size 1 1 1 col1 A B C prise 10000 10000 10000 fact表 1 1 dem3表 10,Large 33,Small 222Small col1 10 33 34 222 999 color RED BLUE RED RED RED size Large Small Medium Small Large price 9900 5000 11000 8000 17700 fact.price < dem3.price 10,9900 33,5000 222,3800 最後に表データを取りだし、全ての検索条件について検査 (C)日本IBMシステムズ・エンジニアリング(株) データシステム部 解説: ダイナミック・ビットマップ・インデックスのしくみ AND検索条件の列について、ビットマップ・インデックスが動的に作成されます。ビットマップ・インデックスはまずゼロに初期化さ れます。次に、列のデータが順にビットマップにハッシュされます。その際に、条件に合致していれば、ビットを立てます。これで最 初のビットマップ・インデックスの完成です。 同じハッシュ値に複数の列データがハッシュされる場合もあります。 「10,RED」 と 「33,BLUE」 は両方とも同じオフセットにハッシュされたと仮定します。「10、RED」は”fact.color=dem1.color”の検索 条件に合致しているので、ビットが1にセットされます。一度セットされた値はリセットされることはありません。従って、これは、「33 BLUE」のキーにとっては間違いのセットとなります。(REDではないのにビットが立ってしまいます。)ですが、最終的に作成された ビットマップを使用して他の条件も含めたデータの検査が行われるので、問題ありません。 次のAND条件に関してビットマップ・インデックスが同様に作成され、最初のビットマップ・インデックスと比較します。両方のイン デックスでビットが立っているもののみビットを立てます。スタージョインの対象となる列分繰り返します。その後、最終的に、ビット マップ・インデックスを使用して表データが取り出され、全ての検索条件と合致しているかどうかが検査されます。 結合条件の列には、索引が作成されている必要があります。 (C)日本IBMシステムズ・エンジニアリング(株) データシステム部 第3章( 65-66 ) DB2 UDB (PC&Unix) デザイン・ガイド 索引設計 5−4.インデックス・アドバイザー SQL 索引の容量 最適な索引を見つける手助けをする ワークロードをベースに探索 仮想の索引による見積もり、コスト計算が可能 パフォーマンス分析およびチューニングの複雑さを軽減 制約 ファ イル 名 DBA 順位 先 優 Lの Q S 度 頻 行 実 Lの Q S 検索条件 CREATE INDEX ...... ADVISE_WORKLOAD表 ADVISE_INDEX表 Index Advisor CREATE INDEX ...... CREATE INDEX ...... C INDREAT EX E ..... . (C)日本IBMシステムズ・エンジニアリング(株) データシステム部 解説: 5−4.インデックス・アドバイザー 適切な索引の存在は、アクセス・パス選択およびSQLのパフォーマンスに多大な影響を与えます。 インデックス・アドバイザーはV6.1から使用可能です。これは、適切な索引の設計や定義に関するマネージメント・ツールです。 ワークロードは、与えられた時間内処理しなければならないSQLステートメントにより設定します。SQLステートメントはSELEC T,INSERT,DELETEステートメントが使用可能です。 例えば、1,000件のINSERT、10,000件のUPDATE、10,000件のSELECT、1,000件のDELETEを、一ヶ月間を通し て行います。ワークロードの情報としては、与えられた時間内でのSQLステートメントの頻度とタイプが考慮されます。アドバイス・ エンジンは、このワークロード情報を、データベース情報と共に使用して、推奨する索引を探索します。アドバイス・エンジンの目 標は、ワークロードの合計コストを最小化することです。この情報は、ADVISE_WORKLOAD表に書き込まれます。十分な情 報と制約によって、アドバイス機能は適切な索引を提示することが可能です。 仮想索引は実際にはデータベースに存在しない索引です。これらの索引は、アドバイス機能から推奨される索引であるか、また は、アドバイス機能を使用してユーザーが評価したい索引です。アドバイス機能は、これらの索引も考慮に入れて処理を行い、推 奨しない場合には、削除されます。 アドバイス機能はワークロード情報とデータベースの統計情報を使用して、推奨する索引を生成します。 ADVISE_WORKLOAD表とADVISE_INDEX表を作成するには、sqllibサブ・ディレクトリーの下のmiscの下にある、EXPL AIN.DDLスクリプトを実行します。作成されていない場合には、Index Smartguideによっても、表を作成することができます。 (C)日本IBMシステムズ・エンジニアリング(株) データシステム部 第3章( 67-68 ) DB2 UDB (PC&Unix) デザイン・ガイド 索引設計 インデックス・アドバイザーの利点と使用法 インデックス・アドバイザーの利点 問題となる照会文に対して最適な索引を見つける 資源の制約を受ける、セットになった照会文に対して最適な索引を見つける 索引を作成せずに、ワークロードに関して索引のテストを行う 索引はメモリー内でシミュレートされる インデックス・アドバイザーを使用する3ステップ 1.情報の入力・収集を行う 事前にEXPLAIN.DDLを実行し、インデックス・アドバイザーが使用する表を作成しておく 2.インデックス・アドバイザー起動する 3.インデックス・アドバイザーの出力のレビューを行う (C)日本IBMシステムズ・エンジニアリング(株) データシステム部 ブランク・ページです 第3章( 69-70 ) DB2 UDB (PC&Unix) デザイン・ガイド 索引設計 ステップ1:情報の入力と収集 ワークロード情報を収集する (SQL ステートメントおよび頻度) イベント・モニターの利用 SYSSTMTシステム・カタログ SQL ステートメントを ADVISE_WORKLOAD表にINSERTする ワークロード情報に変更を加える SQLステートメントの頻度 SQLステートメントの優先順位 制約を決める 索引のディスク容量 インデックス・アドバイザーの最長実行時間 (C)日本IBMシステムズ・エンジニアリング(株) データシステム部 解説: ステップ1:情報の入力と収集 ワークロードの収集方法としては、 イベント・モニターを使用して動的SQLを収集する SYSSTMTカタログ・ビューを使用して静的SQLを収集する ステートメントや頻度をADVISE_INDEX表に追加する ADVISE_WORKLOAD表のSQLステートメントの頻度や優先順位は、変更することが可能です。 索引のディスク容量の上限や、アドバイザーの実行する最長時間も考慮事項として入力します。 動的SQLについては、以下のようにして、ステートメントの実行頻度をモニターから収集します。 モニターのRESETを実行する。モニタリングを行う環境で、十分な数の動的SQLが実行されるまで待つ GET SNAPSHOT FOR DYNAMIC SQLコマンドにより動的SQLについての情報を収集する "insert into advise_workload(select cmyworkloadc,0,stmt_text,cast(generate_unique() as char(254)),num_executions,1,num_executions,0,0 from SYSFUN.SQLCACHE_SNAPSHOT)"を実行する ワークロード情報において、各SQLステートメントの省略時の頻度は1であり、省略時の重要度もまた1です。generate_unique()関 数は、ステートメントにユニークなIDをアサインするために使用していますが、そのSQLステートメントについての、より意味のあ る説明内容に置き換えてもかまいません。 (C)日本IBMシステムズ・エンジニアリング(株) データシステム部 第3章( 71-72 ) DB2 UDB (PC&Unix) デザイン・ガイド 索引設計 ステップ2:起動 起動方法は4通り 方法1:コントロールセンター(CC)を使用(推奨) Index SmartGuide(GUI)からの起動 方法2:コマンド・ラインを使用 db2advisコマンドを実行 方法3:SET CURRENT EXPLAIN MODEを使用 SET CURRENT EXPLAIN MODE RECOMMEND INDEXES :ADVISE_INDEX表に推奨する索引とEXPLAIN情報を格納する。 SET CURRENT EXPLAIN MODE EVALUATE INDEXES :ADVISE_INDEX表にINSERTされた索引情報を考慮して、EXPLAIN情報を格納する。 方法4:CLIを使用 アプリケーションの中で、動的にレビュー、評価、索引の作成を行う (C)日本IBMシステムズ・エンジニアリング(株) データシステム部 解説: ステップ2:起動 インデックス・アドバイザーはコントロール・センターを使用して起動することができ、この方法が推奨されている方法です。コント ロール・センターから、インデックス・フォルダーが見つかるまで、オブジェクト・ツリーを拡張していきます。インデックス・フォルダー で、マウス・ボタン2をクリックし、ポップアップ・メニューからSmartGuideを使用してCreate->Indexを選択します。Index S martGuideが開きます。Index SmartGudeには、ヘルプ機能があり、簡単に使用することができます。SmartGuideは、最近実行され たSQLを探したり、最近使用されたパッケージを探したり、あるいは、SQLステートメントを追加するなどして、ワークロード情報を構 成する機能も持っています。 GUIの方が使い勝手はよく、操作性に優れています。 入力項目がわかりやすい 出力内容が見やすい 索引の見積もり結果がKB単位で表示される(コマンドで実行すると、MB単位での出力となる) 索引作成のスクリプトを作成可能 スクリプトを、スクリプト・センターから実行可能 条件付のUPDATE/DELETEを指定することも可能です。 Index Advisorは、DB2コマンド・ウインドウから起動することもできます。コマンド・ラインで、db2advis と打鍵して実行します。 db2advisは以下の3つの場所のうちの1つからワークロード情報を読み込んで開始されます。 コマンド・ライン テキスト・ファイルにあるステートメント ワークロード情報(SQLステートメントと頻度)をINSERTした後のADVISE_WORKLOAD表 ツールは、CURRTENT EXPLAIN MODEレジスターを使用し、最適な索引を見つけるための内部的なアルゴリズムを使用し ながら、推奨する索引を探します。 Index SmartGuideおよびdb2advisツールは、ADVISE_WORKLOAD表とADVISE_INDEX表を使用して情報の取り出しと格 納を行います。 (C)日本IBMシステムズ・エンジニアリング(株) データシステム部 第3章( 73-74 ) DB2 UDB (PC&Unix) デザイン・ガイド 索引設計 ステップ3:レビュー - CCの例 インデックス・アドバイザー GUI:ワークロード入力のフォルダー 必要な情報を入力 (C)日本IBMシステムズ・エンジニアリング(株) データシステム部 解説: ステップ3:レビュー - CCの例 インデックス・アドバイザー: 推奨する索引表示のフォルダー (C)日本IBMシステムズ・エンジニアリング(株) データシステム部 第3章( 75-76 ) DB2 UDB (PC&Unix) デザイン・ガイド 索引設計 ステップ3:レビュー - db2advisコマンドの例1 SQLステートメントを指定した使用方法 db2advis -d sample -s "select count(*) from sales where region ='QUEBEC' " -t 1 Calculating initial cost (without recommended indexes) [31.198040] timerons Initial set of proposed indexes is ready. Found maximum set of [1] recommended indexes Cost of workload with all indexes included [2.177133] timerons cost without index [0] is [31.198040] timerons. Derived benefit is [29.020907] disk space needed for initial set [1] MB total disk space constrained to [-1] MB 1 indexes in current solution [31.198040] timerons (without indexes) [2.177133] timerons (with current solution) |[%93.02] improvement Trying variations of the solution set. Time elapsed. LIST OF RECOMMENDED INDEXES =========================== index[1], 1MB CREATE INDEX WIZ689 ON VALENTIN.SALES (REGION DESC) =========================== Index Advisor tool is finished. (C)日本IBMシステムズ・エンジニアリング(株) データシステム部 解説: ステップ3:レビュー - db2advisコマンドの例1 db2advisコマンドのオプション -l : ディスク容量の制限を指定します。既存のスキーマにおける全ての索引について、使用可能であるディスクの最大量をメガバ イト単位で指定します。省略時値は、64GBであり、これはパーティションあたりで作成可能な、1索引の最大サイズです。. -t : アドバイスのために所要する最長時間を、分単位で指定します。省略時値は10です。時間制限をしない場合には、ゼロを指 定します。 -s : SQLステートメントを指定します。 -f : 1つ以上のSQLステートメントを含む入力ファイルを指定します。省略時は、標準入力が使用されます。 2つのハイフンは、コメントであることを意味します。 -- <comment> ワークロード情報の中の各ステートメントの実行頻度は、以下の行を入力ファイルに追加することにより変更可能です。 --#SET FREQUENCY <x> 実行頻度の回数に制限はありません。実行回数が少なくても、高パフォーマンスが特に要求される重要なSQLについて は、値を大きくします。 -w : 索引のアドバイスを行うワークロード名を指定します。この名前は、ADVISE_WORKLOAD表で使用されている名前で す。 -d : 接続を確立するデータベース名を指定します。. (C)日本IBMシステムズ・エンジニアリング(株) データシステム部 第3章( 77-78 ) DB2 UDB (PC&Unix) デザイン・ガイド 索引設計 ステップ3:レビュー - db2advisコマンドの例2 入力となるワークロードファイル”sample.sql”を使用した実行方法 db2advis -d sample -f sample.sql -t 0 <sample.sqlの内容> --#SET FREQUENCY 100 select count(*) from sales where region = ?; --#SET FREQUENCY 3 select projno, sum(comm) tot_comm from employee, emp_act where employee.empno = emp_act.empno and employee.job='DESIGNER'group by projno order by tot_comm desc; --#SET FREQUENCY 50 select * from sales where sales_date = ?; found [3] SQL statements from the input file Calculating initial cost (without recommended indexes) [62.331280] timerons Initial set of proposed indexes is ready. Found maximum set of [2] recommended indexes Cost of workload with all indexes included [29.795755] timerons cost without index [0] is [58.816662] timerons. Derived benefit is [29.020907] cost without index [1] is [33.310373] timerons. Derived benefit is [3.514618] total disk space needed for initial set [2] MB total disk space constrained to [-1] MB 2 indexes in current solution [62.331280] timerons (without indexes) [29.795755] timerons (with current solution) [%52.20] improvement Trying variations of the solution set. Time elapsed. LIST OF RECOMMENDED INDEXES =========================== index[1], 1MB CREATE INDEX WIZ119 ON VALENTIN.SALES (SALES_DATE DESC,SALES_PERSON DESC) index[2], 1MB CREATE INDEX WIZ63 ON VALENTIN.SALES (REGION DESC) =========================== (C)日本IBMシステムズ・エンジニアリング(株) データシステム部 ブランク・ページです 第3章( 79-80 )