Sql 如何估计Oracle索引的大小?

Sql 如何估计Oracle索引的大小?,sql,oracle,Sql,Oracle,我正在考虑向Oracle表中添加一个索引,但我想在构建索引后首先估计索引的大小,我不需要精确的大小,只需要估计 假设我可以访问关于表的行数、列数、列数据类型等的所有元数据,我可以执行任意Oracle SQL查询以获取关于表当前状态的附加数据,并且我知道我希望索引定义是什么,那么我如何估计此大小?您可以使用这些 对于一些不太成熟的东西,如果您只想要信封背面的类型: 计算每个组件的平均大小 组成索引键的列 并将列加上一个rowid和 为索引行标题添加2个字节 以获取平均行大小。现在加上 只需稍微更改

我正在考虑向Oracle表中添加一个索引,但我想在构建索引后首先估计索引的大小,我不需要精确的大小,只需要估计

假设我可以访问关于表的行数、列数、列数据类型等的所有元数据,我可以执行任意Oracle SQL查询以获取关于表当前状态的附加数据,并且我知道我希望索引定义是什么,那么我如何估计此大小?

您可以使用这些

对于一些不太成熟的东西,如果您只想要信封背面的类型:

计算每个组件的平均大小 组成索引键的列 并将列加上一个rowid和 为索引行标题添加2个字节 以获取平均行大小。现在加上 只需稍微更改的pctfree值即可 该索引将产生一个开销 系数,对于10的pctfree,可能为1.125

索引表行数X平均行数 透镜x1.125

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

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

此外,可能需要更大的开销系数 随着指数的不断扩大,情况会越来越好 索引的数据越多,分支就越多 支持索引所需的块 结构与计算 只是叶块的数字


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

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

从版本10gR2开始,您可以使用DBMS\u空间。创建\u索引\u成本

从文档:此过程确定在现有表上创建索引的成本。输入是用于创建索引的DDL语句。该过程将输出创建索引所需的存储

例如:

输出:

Used MBytes: 1
Alloc MBytes: 2

下面的SQL查询可用于了解oracle中表所占用的估计值

选择行大小(以字节为单位)*cnt行数/1000/1000/1000索引大小(以GB为单位) 从…起 选择表格名称, 求和列长度/1048576*1000000行大小(以字节为单位) 来自用户索引列 其中table\u name=UPPER'&输入\u table\u name' 按表名称分组 A. 从中选择count1 cnt_of_rows FROM并输入_Table_Name;
就在我需要它8年后——但是,尽管如此,handy:
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