如何估计Oracle索引的大小?

时间:2009-05-05 22:06:09

标签: sql oracle

我正在考虑在Oracle表中添加一个索引,但是我想首先估计索引的大小(我不需要精确的大小 - 只是一个估计。)

假设我可以访问有关表的所有元数据(行数,列数,列数据类型等),我可以执行任意Oracle SQL查询以获取有关表的当前状态的其他数据,我知道我希望索引定义是什么,我该如何估计这个大小?

4 个答案:

答案 0 :(得分:10)

您可以使用这些Oracle Capacity planning and Sizing Spreadsheets

对于那些不完全爆炸的东西,如果你只想要回信封类型rough estimates for the index

  

计算每个的平均大小   构成索引键的列   并将列加上一个rowid和   为索引行标题添加2个字节   获得平均行大小。现在添加   只是对pctfree值的一点点   提出开销的索引   对于10%的pctfree,可能是1.125。

     

索引表行的数量X avg行   len X 1.125

     

注意 - 如果索引包含可空   列然后每个表行可能不会   出现在索引中。在一个单一的   列索引所在列的90%   只有10%会进入   索引。

     

将估算值与表空间范围进行比较   分配方法和调整最终   如有必要,请回答。

     

也可能是更大的开销因素   随着指数变大,效果会更好   索引越多,分支越多   支持索引所必需的块   结构和计算真的   只是叶块的数字。

答案 1 :(得分:2)

您可以通过在create index语句上运行explain plan来估计索引的大小:

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    

查看底部的“注释”部分:估计索引大小:4194K字节

答案 2 :(得分: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);

从文档:“此过程确定在现有表上创建索引的成本。输入是将用于创建索引的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

答案 3 :(得分:0)

下面的SQL查询可用于了解oracle中一个表所占用的估计index size

SELECT (row_size_in_bytes * cnt_of_rows)/1000/1000/1000 index_size_in_GB
FROM
(
  SELECT table_name ,
         (sum (column_length) / 1048576) * 1000000 row_size_in_bytes
  FROM   user_ind_columns
  WHERE  table_name=UPPER('&Enter_Table_Name')
  GROUP  BY table_name
) A,
(SELECT count(1) cnt_of_rows FROM &Enter_Table_Name );