2009-05-05 81 views
7

Oracle表に索引を追加することを検討していますが、索引の作成後に索引のサイズを最初に見積もりたいとします(正確なサイズは必要ありません - 推定値のみ)。Oracleインデックスのサイズはどのように見積もることができますか?

テーブルの現在の状態に関する追加データを取得するために任意のOracle SQLクエリを実行できるテーブル(行数、列数、列データ型の数など)に関するすべてのメタデータにアクセスできるとします。私はインデックスの定義をどのようにしたいのか分かりますが、このサイズをどのように見積もることができますか?

答えて

10

Oracle Capacity planning and Sizing Spreadsheetsを使用できます。ほど本格的ではない何かのために

、あなただけのバックエンベロープタイプrough estimates for the indexのしたい場合:

キー インデックスを構成する 各列の平均サイズを計算し、合計列に1つのrowidと を追加すると、索引行ヘッダー の2バイトが加算され、平均行サイズが取得されます。 インデックスオーバーヘッド 因子を考え出すために今多分1.125平均行 LEN X 1.125

インデックス付きテーブルの行のXの10

数のPCTFREEため、ほんの少しPCTFREE値に を追加注 - インデックスにnull許容可能な のカラムが含まれている場合、すべてのテーブル行が をインデックスに表示しないことがあります。列 の90%がNULLである単一の 列の索引では、10%のみが 索引に入ります。

見積もりを表領域エクステント の割り当て方法と比較し、必要に応じて最終的に の回答を調整します。

も大きなオーバーヘッド要因は、インデックスが大きくなるにつれて 方が良いかもしれ ので、より多くのデータがインデックス 構造をサポートするために必要な ブロックをより多くの枝をインデックス化し、計算は本当に だけのリーフ・ブロックの数値。

2

あなたはindex文の作成にexplain planを実行することにより、インデックスのサイズを見積もることができます推定インデックスサイズ:4194Kバイト下部にある「注」セクションで

create table t as 
    select rownum r 
    from dual 
    connect by level <= 1000000; 

explain plan for 
    create index i on t (r); 

select * 
from table(dbms_xplan.display(null, null, 'BASIC +NOTE')); 

PLAN_TABLE_OUTPUT                               
-------------------------------------------------------------------------------------------------------------------------------------------- 
Plan hash value: 1744693673                             

---------------------------------------                          
| Id | Operation    | Name |                          
---------------------------------------                          
| 0 | CREATE INDEX STATEMENT |  |                          
| 1 | INDEX BUILD NON UNIQUE| I |                          
| 2 | SORT CREATE INDEX |  |                          
| 3 | TABLE ACCESS FULL | T |                          
---------------------------------------                          

Note                                   
-----                                  
    - estimated index size: 4194K bytes  

を見てください

0

使用できるバージョン10gR2のから始まっDBMS_SPACE.CREATE_INDEX_COST

DBMS_SPACE.CREATE_INDEX_COST (
    ddl    IN VARCHAR2, 
    used_bytes  OUT NUMBER, 
    alloc_bytes  OUT NUMBER, 
    plan_table  IN VARCHAR2 DEFAULT NULL); 

docsから: "このプロシージャは、既存のテーブルにインデックスを作成するコストを決定します。入力は、索引の作成に使用されるDDLステートメントです。このプロシージャは、索引を作成するために必要なストレージを出力します。「

を参照してくださいhttps://docs.oracle.com/database/121/ARPLS/d_space.htm#ARPLS68101

(もでsqlfiddle):

DECLARE 
ub NUMBER; 
ab NUMBER; 
BEGIN 
DBMS_SPACE.CREATE_INDEX_COST (
    ddl    => 'CREATE INDEX x_1 ON t1 (a,b,c) TABLESPACE users', 
    used_bytes  => ub, 
    alloc_bytes  => ab 
    ); 
DBMS_OUTPUT.PUT_LINE('Used MBytes: ' || ROUND(ub/1024/1024)); 
DBMS_OUTPUT.PUT_LINE('Alloc MBytes: ' || ROUND(ab/1024/1024)); 
END; 
/

出力:

Used MBytes: 1 
Alloc MBytes: 2 
+0

私はそれに必要なわずか8年後に - しかしを、便利、それにもかかわらず:) – Jared

関連する問題