2009-05-05 86 views
7

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

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

回答

10

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

对于一些不是很全面的,如果你只是想回信封类型rough estimates for the index的:

计算每个 列组成索引键 的平均大小和求和列加上一个rowid和 为索引行标题添加2个字节 以获得平均行大小。现在添加 只是一点点,为 索引的PCTFREE值拿出架空 因素,也许1.125为10

数目的索引表中的行X平均排 LEN PCTFREE X 1.125

注 - 如果索引包含可为空的 列,则每个表行可能不会在索引中出现 。在单列 列索引中,其中90%的列 为空,只有10%将进入 索引。

将估计值与表空间范围进行比较 分配方法并在必要时调整最终的 答案。

此外较大开销因子可以是 更好为指标变大,因为 更多的数据索引的多个分支 块必要支持索引 结构和计算真的 只是数字为叶块。

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字节

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 
+0

才8年后,我需要它 - 但是,很方便,但是:) – Jared 2017-08-20 14:24:56