前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【DB笔试面试561】在Oracle中,如何预估即将创建索引的大小?

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

作者头像
小麦苗DBA宝典
发布2019-09-29 15:40:34
1.3K0
发布2019-09-29 15:40:34
举报

题目部分

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

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

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.

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

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

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

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

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

SQL> CREATE INDEX IDX_T ON SYS.TEST_INDEX_SIZE(OBJECT_ID);
Index created.
SQL>  ANALYZE INDEX IDX_T VALIDATE STRUCTURE;
Index analyzed.
SQL> SELECT BYTES FROM DBA_SEGMENTS WHERE SEGMENT_NAME='IDX_T';
     BYTES
----------
   2097152

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

& 说明:

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

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-05-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DB宝 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档