合 Oracle如何预估即将创建索引的大小?
如果当前表大小是1TB,那么在某一列上创建索引的话索引大概占用多大的空间?对于这个问题,Oracle提供了2种可以预估将要创建的索引大小的办法:
① 利用系统包DBMS_SPACE.CREATE_INDEX_COST直接得到。利用DBMS_SPACE.CREATE_TABLE_COST可以获得将要创建的表的大小。
② 利用Oracle 11g新特性NOTE RAISED WHEN EXPLAIN PLAN FOR CREATE INDEX。
下面分别举例说明。
数据库版本为Oracle 11.2.0.3,实验过程如下所示:
1 2 3 4 | SQL> CREATE TABLE TEST_INDEX_SIZE AS SELECT * FROM DBA_OBJECTS; Table created. SQL> EXEC DBMS_STATS.GATHER_TABLE_STATS(OWNNAME => 'SYS',TABNAME => 'TEST_INDEX_SIZE'); PL/SQL procedure successfully completed. |
第一种办法:DBMS_SPACE.CREATE_INDEX_COST
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | SQL> SET SERVEROUTPUT ON SQL> DECLARE 2 L_INDEX_DDL VARCHAR2(1000); 3 L_USED_BYTES NUMBER; 4 L_ALLOCATED_BYTES NUMBER; 5 BEGIN 6 DBMS_SPACE.CREATE_INDEX_COST(DDL => 'CREATE INDEX IDX_T ON SYS.TEST_INDEX_SIZE(OBJECT_ID)', 7 USED_BYTES => L_USED_BYTES, 8 ALLOC_BYTES => L_ALLOCATED_BYTES); 9 DBMS_OUTPUT.PUT_LINE('USED= ' || L_USED_BYTES || 'BYTES' || 10 ' ALLOCATED= ' || L_ALLOCATED_BYTES || 'BYTES'); 11 END; 12 / USED= 383105BYTES ALLOCATED= 2097152BYTES PL/SQL procedure successfully completed. |