zoukankan      html  css  js  c++  java
  • Oracle 索引可以比表大

     

    上午和DBA 1群的王海讨论了下 索引和 表的关系,他说从网上看到索引比表大。

     

    一般情况下,索引应该是比表小的。google 一下,看到了warehouse大哥的一篇blog,里面有个测试,例子中的索引确实比表大。 

     

    Oracle 索引的维护

    http://blog.csdn.net/tianlesoftware/archive/2010/07/11/5680706.aspx

     

     

    先看一段官网的说明:

    14.1.7 Re-creating Indexes

    You might want to re-create an index to compact it and minimize fragmented space, or to change the index's storage characteristics. When creating a new index that is a subset of an existing index or when rebuilding an existing index with new storage characteristics, Oracle Database might use the existing index instead of the base table to improve the performance of the index build.

     

    However, in some cases using the base table instead of the existing index is beneficial. Consider an index on a table on which a lot of DML has been performed. Because of the DML, the size of the index can increase to the point where each block is only 50% full, or even less. If the index refers to most of the columns in the table, then the index could actually be larger than the table. In this case, it is faster to use the base table rather than the index to re-create the index.

     

    -- 这一段问题里就讲到了,索引也是存放在数据块里面的,索引可以比表大。 

     

    Use the ALTER INDEX ... REBUILD statement to reorganize or compact an existing index or to change its storage characteristics. The REBUILD statement uses the existing index as the basis for the new one. All index storage statements are supported, such as STORAGE (for extent allocation), TABLESPACE (to move the index to a new tablespace), and INITRANS (to change the initial number of entries).

     

    Usually, ALTER INDEX ... REBUILD is faster than dropping and re-creating an index, because this statement uses the fast full scan feature. It reads all the index blocks using multiblock I/O, then discards the branch blocks. A further advantage of this approach is that the old index is still available for queries while the rebuild is in progress.

     

    To avoid calling DBMS_STATS after the index creation or rebuild, include the COMPUTE STATISTICS statement on the CREATE or REBUILD. You can use the Oracle Enterprise Manager Reorg Wizard to identify indexes that require rebuilding. The Reorg Wizard can also be used to rebuild the indexes.

     

     

    出自Oracle 联机文档:

    http://download.oracle.com/docs/cd/E11882_01/server.112/e16638/data_acc.htm#PFGRF94781

     

     

     

    测试:

     

    SQL> create table t(id ,name) as select object_id , object_name from dba_objects;

    表已创建。

     

    SQL> desc t

     名称                                      是否为空? 类型

     ----------------------------------------- -------- ----------------------------

     ID                                                 NUMBER

     NAME                                               VARCHAR2(128)

     

    SQL> create index idx_t on t(id , name);

    索引已创建。

     

    SQL> analyze table t compute statistics;

    表已分析。

     

    SQL> select blocks from user_tables where table_name='T';

    BLOCKS

    ----------

    346

     

    SQL> select leaf_blocks from user_indexes where index_name='IDX_T';

    LEAF_BLOCKS

    -----------

            410

     

    这里index就比表大,表 t只有idname,而index也包含了idname,但是index还包含了rowid

     

     

    SQL> delete from t where id<=5000;

    已删除4931行。

     

    SQL> alter table t move ;

    表已更改。

     

    SQL> analyze table t compute statistics;

    analyze table t compute statistics

    *

    1 行出现错误:

    ORA-01502: 索引 'SYS.IDX_T' 或这类索引的分区处于不可用状态

     

    SQL> alter index idx_t rebuild;

    索引已更改。

     

    SQL> analyze table t compute statistics for all indexes;

    表已分析。

    SQL> select blocks from user_tables where table_name='T';

    BLOCKS

    ----------

    346

     

    SQL> select leaf_blocks from user_indexes where index_name='IDX_T';

    LEAF_BLOCKS

    -----------

    388

     

    SQL> insert into t select object_id , object_name from dba_objects;

    已创建72917行。

     

    SQL> commit;

    提交完成。

     

    SQL> analyze table t compute statistics for all indexes;

    表已分析。

     

    SQL> select blocks from user_tables where table_name='T';

    BLOCKS

    ----------

    346

     

    SQL> select leaf_blocks from user_indexes where index_name='IDX_T';

    LEAF_BLOCKS

    -----------

    825

     

    查看索引占用的空间大小:

    SQL> select (sum(bytes)/1024/1024)||'MB' from dba_segments where segment_name = 'IDX_T';

    (SUM(BYTES)/1024/1024)||'MB'

    ------------------------------------------

    7MB

     

    查看表占用空间大小:

    SQL> select (sum(bytes)/1024/1024)||'MB' from dba_segments where segment_name = 'T';

     

    (SUM(BYTES)/1024/1024)||'MB'

    ------------------------------------------

    6MB

     

    通过执行dml操作,效果更加明显,index显然比表t大。

     

     

     

     

    ------------------------------------------------------------------------------

    Blog http://blog.csdn.net/tianlesoftware

    网上资源: http://tianlesoftware.download.csdn.net

    相关视频:http://blog.csdn.net/tianlesoftware/archive/2009/11/27/4886500.aspx

    DBA1 群:62697716(); DBA2 群:62697977()

    DBA3 群:62697850   DBA 超级群:63306533;    

    聊天 群:40132017

    --加群需要在备注说明Oracle表空间和数据文件的关系,否则拒绝申请

    道森Oracle,国内最早、最大的网络语音培训机构,我们提供专业、优质的Oracle技术培训和服务! 我们的官方网站:http://www.daosenoracle.com 官方淘宝店:http://daosenpx.taobao.com/
  • 相关阅读:
    2020/5/18 BUU_ [GWCTF 2019]xxor
    2020/5/17 BUU_[BJDCTF2020]BJD hamburger competition
    2020/5/17 BUU_[BJDCTF2020]easy
    2020/5/16 BUU_ [ACTF新生赛2020]easyre
    2020.5.16 15:06
    由一道逆向题而引发,IDA调试ELF文件
    【攻防世界】对于parallel-comparator-200的理解的感想
    『攻防世界』:新手区 | when_did_you_born
    『攻防世界』:新手区 | guess number
    『攻防世界』:新手区 | level3
  • 原文地址:https://www.cnblogs.com/tianlesoftware/p/3609946.html
Copyright © 2011-2022 走看看