ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

【DB笔试面试561】在Oracle中,如何预估即将创建索引的大小?

2021-04-10 22:55:13  阅读:153  来源: 互联网

标签:INDEX DBMS 561 CREATE DB 索引 Oracle BYTES



♣          题目         部分

在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= 2097152BYTES
15PL/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--------------------------------------------------------------------------------
16Note
17-----
18   - estimated index size: 2097K bytes
1914 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     BYTES
7----------
8   2097152
     


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

& 说明:

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

 



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



watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=     

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

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

 

标签:INDEX,DBMS,561,CREATE,DB,索引,Oracle,BYTES
来源: https://blog.51cto.com/lhrbest/2698555

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有