♣          题目         部分

在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,实验过程如下所示:

1SQL> CREATE TABLE TEST_INDEX_SIZE AS  SELECT * FROM DBA_OBJECTS;2Table created.3SQL>  EXEC DBMS_STATS.GATHER_TABLE_STATS(OWNNAME => 'SYS',TABNAME => 'TEST_INDEX_SIZE');4PL/SQL procedure successfully completed.
     


第一种办法:DBMS_SPACE.CREATE_INDEX_COST

 1SQL> SET SERVEROUTPUT ON 2SQL> DECLARE 3  2    L_INDEX_DDL     VARCHAR2(1000); 4  3    L_USED_BYTES     NUMBER; 5  4    L_ALLOCATED_BYTES NUMBER; 6  5  BEGIN 7  6    DBMS_SPACE.CREATE_INDEX_COST(DDL     => 'CREATE INDEX IDX_T ON SYS.TEST_INDEX_SIZE(OBJECT_ID)', 8  7                      USED_BYTES  => L_USED_BYTES, 9  8                      ALLOC_BYTES => L_ALLOCATED_BYTES);10  9    DBMS_OUTPUT.PUT_LINE('USED= ' || L_USED_BYTES || 'BYTES' ||11 10                  '     ALLOCATED= ' || L_ALLOCATED_BYTES || 'BYTES');12 11  END;13 12  /14USED= 383105BYTES     ALLOCATED= 2097152BYTES15PL/SQL procedure successfully completed.
     


 

说明:USED_BYTES代表实际使用的字节数,而ALLOCATED代表申请的字节数。

第二种办法:Oracle 11g新特性:NOTE RAISED WHEN EXPLAIN PLAN FOR CREATE INDEX

这是一个非常实用的小特性,在Oracle 11gR2中使用EXPLAIN PLAN FOR CREATE INDEX时,Oracle会提示评估的索引大小(ESTIMATED INDEX SIZE)了:

 1SQL> SET LINESIZE 200 PAGESIZE 1400; 2SQL>  EXPLAIN PLAN FOR CREATE INDEX IDX_T ON SYS.TEST_INDEX_SIZE(OBJECT_ID); 3Explained. 4SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY()); 5PLAN_TABLE_OUTPUT 6------------------------------------------------------------------------------------- 7Plan hash value: 32582980 8-------------------------------------------------------------------------------- 9| Id  | Operation               | Name  | Rows  | Bytes | Cost (%CPU)| Time     |10--------------------------------------------------------------------------------11|   0 | CREATE INDEX STATEMENT |       | 76621 |   374K|   350  (1) | 00:00:05 |12|   1 |  INDEX BUILD NON UNIQUE| IDX_T |       |       |            |            |13|   2 |   SORT CREATE INDEX    |       | 76621 |   374K|               |             |14|   3 |    INDEX FAST FULL SCAN| IDX_T |       |       |               |             |15--------------------------------------------------------------------------------16Note17-----18   - estimated index size: 2097K bytes1914 rows selected.
     


创建真实索引查看占用的字节数:

1SQL> CREATE INDEX IDX_T ON SYS.TEST_INDEX_SIZE(OBJECT_ID);2Index created.3SQL>  ANALYZE INDEX IDX_T VALIDATE STRUCTURE;4Index analyzed.5SQL> SELECT BYTES FROM DBA_SEGMENTS WHERE SEGMENT_NAME='IDX_T';6     BYTES7----------8   2097152
     


从上面的内容可以看到,两种办法给出的索引评估大小与实际索引占用空间大约都为2M,所以,差别并不大,但这里有个前提条件就是预估索引大小之前必须对表进行分析过。

& 说明:

有关如何预估即将创建索引的大小可以参考我的BLOG:http://blog.itpub.net/26736162/viewspace-1381160/

 



本文选自《Oracle程序员面试笔试宝典》,作者:李华荣。



     

---------------优质麦课------------

 

©著作权归作者所有:来自51CTO博客作者小麦苗DB宝的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. Oracle之函数索引
  2. Tomcat 内存溢出
  3. 完整部署CentOS7.2+OpenStack+kvm 云平台环境(6)--在线调整虚拟机
  4. Python中tuple和list有什么区别?Python入门!
  5. ELK基础架构解说-运维笔记
  6. Oracle索引的监控
  7. 洋洋洒洒一万二千字,彻底讲清楚MySQL的优化原理,看不完先收藏
  8. 「开源免费」基于Vue和Quasar的前端SPA项目crudapi后台管理系统
  9. 数据分析之Pandas合并操作总结

随机推荐

  1. 动画:什么是堆?
  2. 动画:用动画给面试官解释 KMP 算法
  3. 保姆级教学:手把手教你如何实现同期群分析
  4. 考研成绩出了,你考的怎么样?
  5. 这篇博士毕业论文致谢句句诛心......
  6. 我太难了,太难了!!!
  7. 动画:如何用「前端」做出吊炸天基于大数据
  8. 为何总给外卖打差评?我们来数据分析一下!
  9. 动画:面试必刷之二叉树搜索第 K 大节点
  10. “没想到吧,我胡汉三又回来了!”