Sql 如何估计Oracle索引的大小?
我正在考虑向Oracle表中添加一个索引,但我想在构建索引后首先估计索引的大小,我不需要精确的大小,只需要估计 假设我可以访问关于表的行数、列数、列数据类型等的所有元数据,我可以执行任意Oracle SQL查询以获取关于表当前状态的附加数据,并且我知道我希望索引定义是什么,那么我如何估计此大小?您可以使用这些 对于一些不太成熟的东西,如果您只想要信封背面的类型: 计算每个组件的平均大小 组成索引键的列 并将列加上一个rowid和 为索引行标题添加2个字节 以获取平均行大小。现在加上 只需稍微更改的pctfree值即可 该索引将产生一个开销 系数,对于10的pctfree,可能为1.125 索引表行数X平均行数 透镜x1.125 注意-如果索引包含可为空的 列,则每个表行都不能 出现在索引中。一个人 列索引,其中90%的列 如果为空,则只有10%将进入 索引 将估计值与表空间范围进行比较 分配方法和最终调整 如有必要,请回答 此外,可能需要更大的开销系数 随着指数的不断扩大,情况会越来越好 索引的数据越多,分支就越多 支持索引所需的块 结构与计算 只是叶块的数字Sql 如何估计Oracle索引的大小?,sql,oracle,Sql,Oracle,我正在考虑向Oracle表中添加一个索引,但我想在构建索引后首先估计索引的大小,我不需要精确的大小,只需要估计 假设我可以访问关于表的行数、列数、列数据类型等的所有元数据,我可以执行任意Oracle SQL查询以获取关于表当前状态的附加数据,并且我知道我希望索引定义是什么,那么我如何估计此大小?您可以使用这些 对于一些不太成熟的东西,如果您只想要信封背面的类型: 计算每个组件的平均大小 组成索引键的列 并将列加上一个rowid和 为索引行标题添加2个字节 以获取平均行大小。现在加上 只需稍微更改
您可以通过在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