Oracle创建索引前估算索引大小(dbms_space.create_index_cost)
Oracle创建索引前估算索引大小(dbms_space.create_index_cost)
在一个表的某个字段创建索引前估算其大小,最好的办法就是在测试库创建索引做预测。
如果没有测试环境还可以使用dbms_space.create_index_cost来估算其大小。
如果没有测试环境还可以使用dbms_space.create_index_cost来估算其大小。
语法: www.zzzyk.com
DBMS_SPACE.CREATE_INDEX_COST (
ddl IN VARCHAR2,
used_bytes OUT NUMBER,
alloc_bytes OUT NUMBER,
plan_table IN VARCHAR2 DEFAULT NULL);
示例:
[sql]
SQL> create table xyc_test (id int,name varchar(32));
表已创建。 www.zzzyk.com
SQL> begin
2 for i in 1..100000 loop
3 insert into xyc_test values(i,'向银春');
4 end loop;
5 commit;
6 end;
7 /
PL/SQL 过程已成功完成。
SQL> exec dbms_stats.gather_table_stats(user,'XYC_TEST');
PL/SQL 过程已成功完成。
SQL> variable used_bytes number;
SQL> variable alloc_bytes number;
SQL> exec DBMS_SPACE.CREATE_INDEX_COST('create index x_idx on xyc_test(id)',:used_bytes,:alloc_bytes);
PL/SQL 过程已成功完成。
SQL> print :used_bytes
500000
----估算分配大小
SQL> print :alloc_bytes
3145728
SQL> create index x_idx on xyc_test(id);
索引已创建。
----实际分配大小,这里感觉和估算的相差较大,可能和数据量有关
SQL> select bytes from user_segments where segment_name='X_IDX';
2097152
或使用下面的方法更方便
[sql]
SQL> declare
2 v_ddl varchar(1024);
3 v_used_bytes number;
4 v_alloc_bytes number;
5 begin
6 dbms_space.create_index_cost(
7 ddl =>' create index x_idx on xyc_test(id) ',used_bytes=>v_used_bytes,alloc_bytes =>v_alloc_bytes);
8 dbms_output.put_line('used_bytes='||v_used_bytes||' bytes'||' alloc_bytes='|| v_alloc_bytes || ' bytes');
9 end;
10 /
used_bytes=500000 bytes alloc_bytes=3145728 bytes
PL/SQL 过程已成功完成。