我正在考虑在Oracle表中添加一个索引,但是我想首先估计索引的大小(我不需要精确的大小 - 只是一个估计。)
假设我可以访问有关表的所有元数据(行数,列数,列数据类型等),我可以执行任意Oracle SQL查询以获取有关表的当前状态的其他数据,我知道我希望索引定义是什么,我该如何估计这个大小?
答案 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 );