Index Split

目次

概要

オラクルのB-Treeインデックスのブロックがいっぱい(Full)になった場合、Splitを介して新たな空間を確保します。Index Splitの種類は、次のように分けられます。

 ・Branch Node Split:Branch NodeやRoot Nodeがいっぱいになる場合に発生するSplitです。
   常に50:50にSplitが行われます。
・Leaf Node Split:Leaf Nodeがいっぱいになる場合に発生するSplitです。Splitが発生する位置に基づいて
  50:50 Splitと90:10 Splitに分類されます。

Index Splitは、インデックスのサイズが成長する過程で必然的に発生する現象で、これを回避する方法はありません。しかし、同時に、多くのセッションがDMLを実行する過程で、Index Splitが発生すると、競合が発生して、全体的なパフォーマンスの低下が発生します。

詳細

50:50 vs 90:10

一般的なLeaf Node Splitは50:50の割合で行われます。つまり、Leaf Blockがいっぱいになる新しいブロックを割り当てられた後、既存のブロックと新しいブロックに50:50にキーの値を再分配します。しかし、最も右端のLeaf Nodeで最大のキー値が挿入されることでSplitが発生した場合には、新たに割り当てられたブロックには、新たに追加されたキー値だけが追加されます。すなわち、従来のつまったブロックのキー値を再分配していません。このような理由のために90:10 Splitを99:1、または100:0 Splitと呼ぶこともあります。90:10 Splitは、インデックスキー値が一方向に増加し、キーの値が挿入される場合に発生します。

IndexSplit

Index Splitと統計値

Index Splitに関するオラクル統計値は、以下の通りです。

SQL> SELECT * FROM v$statname WHERE name LIKE '%split%' AND name LIKE '%node%';
STATISTIC#	NAME			CLASS	STAT_ID
262		leaf node splits	128	1417124053
263		leaf node 90-10 splits	128	1285138251
264		branch node splits	128	399027615

Index Splitと待機イベント

・enq:TX - index contention:一つのトランザクションがインデックスブロックをSplitする間、
 同じインデックスブロックを使用する他のトランザクションは、enq:TX - index contentionイベントを待機します。
・gc current split:RACでIndex Splitが発生した場合に発生するイベントです。インスタンスAが特定のインデックス
 ブロックの転送をインスタンスBに要求したと仮定します。インスタンスBのLMSプロセスがそのインデックスブロック
 を送信しようとする時点でIndex Splitが発生した場合、LMSプロセスがSplitが終わるまで待機した後、そのブロックを
 送信します。この時、応答を受信したインスタンスAはgc current splitを待機したものとみなされます。

SequenceとIndex Split

Sequenceを利用して、インデックスキーの値を生成する場合、Index Splitが過度に発生する主な原因の一つとなります。これは、常に最右ノードにのみInsertが集中され、Splitが頻繁に発生するためです。IndexによるOrderingが不要な場合には、Reverse Indexを使用することにより、このような現象を避けることができます。

無分別なインデックスの作成

不要なインデックスを無分別に作成し、不要なキー値をインデックスに追加することもIndex Splitが過度に発生する主な原因の一つとなります。インデックスは、必ず必要なカラムのみ生成し、重複インデックスは、できれば避けることが望まれます。

Index SplitとAutonomous Transaction

トランザクションの実行中にIndex Split作業が必要な場合は、OracleはAutonomous Transactionを利用してSplit処理を実行します。したがって、親トランザクションがロールバックされてもIndex Split処理はAutonomous Transactionによって永久的に記録されます。

関連情報

1.enq:TX - index contention待機イベント
2.gc current split待機イベント

外部参照

1.Index Internal – Richard Foote