当前位置:  数据库>oracle

Oracle索引合并coalesce操作

    来源: 互联网  发布时间:2017-06-15

    本文导语: 索引rebuild和rebuild online是运维环境中经常遇到的问题。但是无论哪种,大数据索引对象的rebuild都是消耗资源的大规模操作,都需要进行时间窗规划,避免对在线系统运行有影响。 本篇主要介绍对索引的另一种精简操作方法:coal...

索引rebuild和rebuild online是运维环境中经常遇到的问题。但是无论哪种,大数据索引对象的rebuild都是消耗资源的大规模操作,都需要进行时间窗规划,避免对在线系统运行有影响。

本篇主要介绍对索引的另一种精简操作方法:coalesce合并。从之前的讨论我们已经知道,索引结构一般是一个不断“退化”的平衡结构,如果有一个新值加入,就可能会伴随叶子节点拓展,甚至包括分支节点创建。而一个值被删除修改,叶子节点只是被标注为已删除,不会进行节点合并和回收。这样,正常环境下的索引应该是叶子“支离破碎”、“缓慢膨胀”的段结构。

回收空间、让叶子节点更加紧密是管理员考虑rebuild的基本出发动机。紧密的新索引的确空间占用比较小,检索速度也较快。但是之后插入、更新、删除的过程后,依然伴随着空间分配过程的损耗。所以,笔者个人认为:也许健康的索引结构就应该是“支离破碎”、“缓慢膨胀”。Coalesce操作提供的一种逻辑重组索引的方式,仅对索引树进行重组,不进行数据回收。

1、环境介绍

笔者选择11gR2进行实验。

SQL> select * from v$version;

BANNER

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

Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production

PL/SQL Release 11.2.0.3.0 - Production

CORE  11.2.0.3.0    Production

TNS for Linux: Version 11.2.0.3.0 - Production

NLSRTL Version 11.2.0.3.0 - Production

创建数据表T,构建索引。

SQL> create table t as select * from dba_objects ;

Table created

SQL> create index idx_t_id on t(object_id);

Index created

为了模拟效果,删除大部分数据构成死节点。

SQL> select max(object_id) from t;

MAX(OBJECT_ID)

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

        164092 

SQL> delete t where object_id commit;

Commit complete

重新收集统计量。

SQL> exec dbms_stats.gather_table_stats(user,'T',cascade => true);

PL/SQL procedure successfully completed 

SQL> commit;

Commit complete 

SQL> select count(*) from t;

  COUNT(*)

----------

        1

2、coalesce操作

Delete操作既不会回收数据段,也不会回收索引段。当前一行数据表T对应的段信息如下:

SQL> select EXTENT_ID, FILE_ID, BLOCK_ID, BYTES, BLOCKS from dba_extents where owner='SYS' and segment_name='T';

 EXTENT_ID    FILE_ID  BLOCK_ID      BYTES    BLOCKS

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

        0          1      86984      65536          8

        1          1      86992      65536          8

        2          1      87000      65536          8

        3          1      87008      65536          8

        4          1      87016      65536          8

        5          1      87024      65536          8

        6          1      87032      65536          8

        7          1      88960      65536          8

        8          1      88968      65536          8

        9          1      88976      65536          8

        10          1      88984      65536          8

        11          1      88992      65536          8

        12          1      89000      65536          8

        13          1      89008      65536          8

        14          1      90360      65536          8

        15          1      91008      65536          8

        16          1      89088    1048576        128

        17          1      89216    1048576        128

        18          1      89344    1048576        128

        19          1      89472    1048576        128

 

 EXTENT_ID    FILE_ID  BLOCK_ID      BYTES    BLOCKS

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

        20          1      89600    1048576        128

        21          1      89728    1048576        128

        22          1      89856    1048576        128

        23          1      89984    1048576        128

 

24 rows selected

索引段如下:

SQL> select EXTENT_ID, FILE_ID, BLOCK_ID, BYTES, BLOCKS from dba_extents where owner='SYS' and segment_name='IDX_T_ID'; 

 EXTENT_ID    FILE_ID  BLOCK_ID      BYTES    BLOCKS

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

        0          1      91704      65536          8

        1          1      91712      65536          8

        2          1      91720      65536          8

        3          1      91728      65536          8

        4          1      91736      65536          8

        5          1      91744      65536          8

        6          1      91752      65536          8

        7          1      91760      65536          8

        8          1      91768      65536          8

        9          1      92544      65536          8

        10          1      92552      65536          8

        11          1      92560      65536          8

        12          1      92568      65536          8

        13          1      92576      65536          8

        14          1      92584      65536          8

        15          1      92592      65536          8

        16          1      91776    1048576        128

17 rows selected

多extent结构,表示结构没有回收。下面使用analyze语句分析一下索引的情况:

SQL> analyze index idx_t_id validate structure;

Index analyzed

SQL> select height, blocks, lf_rows, lf_blks, lf_rows_len, lf_blk_len, br_rows, br_blks, del_lf_rows from index_stats;

    HEIGHT    BLOCKS    LF_ROWS    LF_BLKS LF_ROWS_LEN LF_BLK_LEN    BR_ROWS    BR_BLKS DEL_LF_ROWS

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

        2        256      77406        172    1227792      7996        171          1      77405

索引树两层结构,包括了256个数据库,叶子节点包括77406个,被删除节点77405个。

开启10046事件跟踪coalesce过程操作。

SQL> select value from v$diag_info where name='Default Trace File'; 

VALUE

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

/home/oracle/app/diag/rdbms/awpdb/awpdb/trace/awpdb_ora_14931.trc 

SQL> alter session set events '10046 trace name context forever, level 12';

Session altered. 

SQL> alter index idx_t_id coalesce;

Index altered. 

SQL> alter session set events '10046 trace name context off';

Session altered.

操作之后检查一下结构效果。

SQL> select EXTENT_ID, FILE_ID, BLOCK_ID, BYTES, BLOCKS from dba_extents where owner='SYS' and segment_name='IDX_T_ID';

 EXTENT_ID    FILE_ID  BLOCK_ID      BYTES    BLOCKS

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

        0          1      91704      65536          8

        1          1      91712      65536          8

        2          1      91720      65536          8

        3          1      91728      65536          8

        4          1      91736      65536          8

        5          1      91744      65536          8

        6          1      91752      65536          8

        7          1      91760      65536          8

        8          1      91768      65536          8

        9          1      92544      65536          8

        10          1      92552      65536          8

        11          1      92560      65536          8

        12          1      92568      65536          8

        13          1      92576      65536          8

        14          1      92584      65536          8

        15          1      92592      65536          8

        16          1      91776    1048576        128

17 rows selected

索引段存储分配没有发生变化,还是17个extent。但是索引逻辑结构已经变化:

SQL> analyze index idx_t_id validate structure;

Index analyzed

SQL> select height, blocks, lf_rows, lf_blks, lf_rows_len, lf_blk_len, br_rows, br_blks, del_lf_rows from index_stats;

    HEIGHT    BLOCKS    LF_ROWS    LF_BLKS LF_ROWS_LEN LF_BLK_LEN    BR_ROWS    BR_BLKS DEL_LF_ROWS

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

        2        256          1          1          16      7996          0          1          0

索引高度和分配块数量没有变化,但是叶子节点进行了重组。被删除数据节点被整理合并。

3、10046文件分析

从10046事件文件分析的情况看,如下:

=====================

PARSING IN CURSOR #139851695602760 len=29 dep=0 uid=0 oct=11 lid=0 tim=1427182487640740 hv=4054144165 ad='aa2f2710' sqlid='a88sghvsuap55'

alter index idx_t_id coalesce

END OF STMT

PARSE #139851695602760:c=17997,e=56662,p=9,cr=117,cu=0,mis=1,r=0,dep=0,og=1,plh=0,tim=1427182487640739

根据游标编号,可以定位到检索读取数据过程。

WAIT #139851695602760: nam='db file sequential read' ela= 8 file#=1 block#=91705 blocks=1 obj#=164093 tim=1427182487878712

WAIT #139851695602760: nam='db file sequential read' ela= 6 file#=1 block#=91706 blocks=1 obj#=164093 tim=1427182487878751

WAIT #139851695602760: nam='db file sequential read' ela= 8 file#=1 block#=91707 blocks=1 obj#=164093 tim=1427182487878989

WAIT #139851695602760: nam='db file sequential read' ela= 9 file#=1 block#=91708 blocks=1 obj#=164093 tim=1427182487879576

WAIT #139851695602760: nam='db file sequential read' ela= 9 file#=1 block#=91709 blocks=1 obj#=164093 tim=1427182487879914

(篇幅原因,有省略……)

WAIT #139851695602760: nam='db file sequential read' ela= 7 file#=1 block#=91821 blocks=1 obj#=164093 tim=1427182487929761

大量单块读动作,每次集中在164093编号的对象上。

SQL> select object_name, owner from dba_objects where object_id=164093;

OBJECT_NAM OWNER

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

IDX_T_ID  SYS

说明:合并操作是针对原有索引数据进行读取,之后合并索引。

4、结论

相对于rebuild,coalesce操作讨论的比较少,伴随着结构的变化,并没有发生存储结构的调整回收。相对于rebuild,coalesce有几个优势:

  • 不需要占用近磁盘存储空间 2 倍的空间
  • 可以在线操作
  • 无需重建索引结构,而是尽快地合并索引叶块,这样可避免系统开销过大

  •     
     
     

    您可能感兴趣的文章:

  • Oracle 合并查询
  • oracle列合并的实现方法
  • oracle合并列的函数wm_concat的使用详解
  • oracle 合并查询 事务 sql函数小知识学习
  • Oracle 多行记录合并/连接/聚合字符串的几种方法
  • Oracle与Mysql主键、索引及分页的区别小结
  • 从Oracle的约束到索引
  • Oracle 9i轻松取得建表和索引的DDL语句
  • Oracle9i取得建表和索引的DDL语句
  • oracle10g全文索引自动同步语句使用方法
  • Oracle 9i轻松取得建表和索引的DDL语句 iis7站长之家
  • 在Oracle 10g中如何获得索引的专家建议
  • Oracle全文索引设置
  • 用Oracle 9i全索引扫描快速访问数据
  • Oracle中如何把表和索引放在不同的表空间里
  • Oracle索引存储关系到数据库的运行效率
  • Oracle索引聚簇表的数据加载
  • 在Oracle中监控和跟踪索引使用情况
  • oracle 索引的相关介绍(创建、简介、技巧、怎样查看) .
  • Oracle中检查是否需要重构索引的sql
  • 轻松取得Oracle 9i建表和索引DDL语句
  • 深度揭露Oracle索引使用中的限制
  • Oracle索引(B*tree与Bitmap)的学习总结
  • oracle 索引不能使用深入解析
  • SQL Server和Oracle数据库索引介绍
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Oracle数据库中COALESCE函数使用详解
  • Oracle 12c发布简单介绍及官方下载地址
  • 在linux下安装oracle,如何设置让oracle自动启动!也就是让oracle那个服务自动启动,不是手动的
  • oracle 11g最新版官方下载地址
  • 请问su oracle 和su - oracle有什么不同?
  • Oracle 数据库(oracle Database)Select 多表关联查询方式
  • 虚拟机装Oracle R12与Oracle10g
  • Oracle数据库(Oracle Database)体系结构及基本组成介绍
  • Oracle 数据库开发工具 Oracle SQL Developer
  • 如何设置让Oracle SQL Developer显示的时间包含时分秒
  • Oracle EBS R12 支持 Oracle Database 11g
  • Oracle 10g和Oracle 11g网格技术介绍
  • SCO unix下安装oracle,但没有光盘,请大家推荐一个oracle下载站点(unix版本的)。谢谢!!!!
  • oracle中如何把表中具有相同值列的多行数据合并成一行
  • 请问大家用oracle数据库, 用import oracle.*;下的东西么? 还是用标准库?
  • Oracle 数据库(oracle Database)性能调优技术详解
  • Linux /$ORACLE_HOME $ORACLE_HOME
  • ORACLE日期相关操作
  • Linux系统下Oracle的启动与Oracle监听的启动
  • ORACLE数据库常用字段数据类型介绍
  • 请问在solaris下安装ORACLE,用root用户和用oracle用户安装有什么区别么?
  • Oracle 12c的九大最新技术特性介绍
  • 网间Oracle的连接,远程连接Oracle服务器??


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3