インデックス設計

インデックスは、アクセスパターンを基にwhere句の結合キー項目、検索キー項目、ソートキー項目にインデックスを定義します。大量の挿入処理が発生するテーブルについては検索処理とのバランスからトレードオフを考慮し、チューニングの段階で最終調整を行います。



5.3.1.容量概算手順

インデックス容量を以下の算出式に従って算出し、余裕率50%(索引は行が表から削除されても領域を開放しないため)を上乗せした値をinitialエクステントサイズとしinitialエクステントサイズの10%をnextエクステントサイズとします。また、PCTFREEは10で、手順はB-Treeベースとします。


0.前提項目 LOC_IDとLOCATION_NAMEの2列に対して、ユニーク・インデックスI_LOCを表領域INDEXに作成します。

SQL>DESC LOCATION


名前 タイプ
------------------------------- -------
LOC_ID NUMBER(10)
LOCATION_NAME CHAR(30)
PROVINCE_ID VARCHAR2(2)
LOC_TYPE VARCHAR2(2)



 

1.動的パフォーマンス表V$PARAMETERよりDB_BLOCK_SIZEを調査します。

SVRMGR> select value from v$parameter where name = 'db_block_size'; 

VALUE

------------------------------------------------------------

4096



--- ここからは机上で実施 ---

2.ブロックサイズ・ヘッダーを求めます。

ブロックサイズ・ヘッダー = 固定長ヘッダ + 可変長トランザクション・ヘッダー

                = 113 + (24 * INITRANS)

= 113 + (24 * 2) 

= 161



3.使用できる領域を計算します。

(ブロックサイズ) - (ブロックサイズヘッダー)

=4096 - 161 = 3935 Byte



4.利用可能データ領域を計算します。

ceil( 3935 * (1-(10/100))) = 3542 Byte (切上げ)


 

5.索引行サイズ(IROWSZ)を計算します。

索引行サイズ = 行ヘッダー + バイト長を加えた索引列データ領域サイズの和


バイト長を加えた索引列データ領域サイズの和 

= (索引定義列値 + オーバーヘッド)+(索引定義列値 + オーバーヘッド)+( … )


オーバーヘッド=1

= 7 + 31 (LOC_ID = 6 + 1 = 7 、 LOCATION_NAME = 30 + 1 = 31)

= 38 


索引行サイズ (IROWSZ)

= (3 * UB1) + 38

= 41Byte 



6.索引行あたりに使用される領域サイズ(RAVG)を計算します。

max (UB1 * 3 + UB4 + SB2, IROWSZ) + SB2

max (1 * 3 + 4 + 2, 41) + 2 = 49

max (9,41) + 2 = 43 Bytes



7.全体の索引値を計算します。

エントリヘッダ + ROWID長 + F + V + RAVG

 = 2 + 6 + 2 + 0 + 43

F:127B以下の列1に対して +1

 = 53(RNU)


V:128B以上の列1に対して +1



8.ユニークインデックスなので、さらに+1します。

       = 53 + 1 

       = 54 (RUI)



9. 4で計算した値に対して、ユニークの場合は(RUI)を、非ユニークの場合は(RNU)で、ブロックあたりの平均索引エントリ数を計算します。

ユニークインデックス  = floor( 3542 / 54 )  = 65 row per data block        

非ユニークインデックス = floor( 3542 / 53 )  = 66 row per data block        floor():切り捨て



以上により、ブロックあたり、ユニークインデックスでは65個、非ユニークインデックスでは66個格納できることが分かります。


10. 9のユニークインデックスの場合における必要なブロック数とバイト数を計算します。ここで、索引を構成する列でNullでない行が10,000件あるとします。

必要ブロック数 = ceil(1.05*Nullでない索引の件数 / ブロックあたりの平均索引エントリ数)

= ceil (1.05 * 10000 / 65) = 162

必要バイト数  = 必要ブロック数 / ブロック・サイズ

           = 162 * 4096 = 663,552 Byte


 


5.3.2.エクステント・PCTUSEDの算出

インデックスにはテーブルと違いPCTFREEがありません。エクステントは最小・最大値を設定します。



5.3.3.効率的なインデックスの利用

インデックスを効果的に利用する方法は、「データベース開発標準 2.1 インデックスの利用」を参照します。



5.3.4.設定指針

インデックス作成における指針を示します。


・minextents = 1, maxextents =249 , pctuserd = 5とします。

・INITIAL * 1.05, NEXT(INITIAL * 1.05) * 0.1



SQL>create unique index I_LOC on LOCATION(loc_id, location_name)

  2>tablespace INDEX 

  3>storage(initial 643K next 68K pctincrease 0) nologging;


 

詳細については、「Oracle8Server 管理者ガイド」の付録「スキーマ・オブジェクトの領域の見積もり」を参照してください。

最終更新:2008年11月15日 22:15