【fragmentation】ORACLE中碎片小结

标签: fragmentation oracle 碎片 | 发表时间:2013-11-26 07:44 | 作者:ballontt
出处:http://blog.csdn.net

碎片的产生总的来讲是因为不断插入,修改使得产生一些小的无法利用的空闲空间。碎片根据产生的位置不同分多种情况,其层级关系如下:

disk-level fragmention

  tablespace-level fragmentation

    segment-level fragmentation

       block-level fragmentation

           row-level fragmentation

       index leaf block-level fragmentation

我们这里针对tablespace-level fragmentation(table,index)进行介绍

1.表空间的碎片整理

本地盘区管理出现之前使用DMT, 数据段segment的扩展extent会参考pctincrease 来增长,区是一段连续的空间,这会导致一个表空间上出现大大小小的extents,过多extents会造成表空间上的碎片过多,即时在free space很大的情况下却可能无法放下一个连续的大的extents,例如free space有1G ,但是每个free extents实际都不超过16MB ,这时候如果要分配一个32MB的extents也做不到。

因此对于DMT 有必要定期做alter tablespace  coalesce的合并操作, 将小的extents合并成大的extents,减少碎片。这是表空间的碎片整理。

而在LOCAL Management extents下分配的extent 或者是 uniform 固定大小的例如 1MB-128M,或者是autoallocate 系统自动分配的从 8* blocks 到更多。表空间碎片的问题已经减少了。10g中除了个别现象和DMT基本可以忽略表空间碎片这个话题了。

 

2. 段的碎片整理

2.1 检测表的碎片情况

一般来说,高水位线以下空闲的空间占总空间的30%以上时就需要进行碎片整理。其脚本如下:

REM LOCATION:   Object Management\Tables\Reports
REM FUNCTION:   Tables that may benefit from a rebuild.
REM TESTED ON:  10.2.0.3, 11.1.0.6 (Will not work versions < 10.1.)
REM PLATFORM:   non-specific
REM REQUIRES:   dba_tables, dba_segments, v$parameter.
REM             Tables must be analyzed.
REM NOTE:       The use of the FIRST_ROWS hint is needed to bypass a bug in 10g
REM             when querying the VALUE column if v$parameter. It can be removed
REM             if you are using this query with Oracle 11g, as this problem
REM             has been corrected. Reference Metalink note 1016476.102 for more info.
REM
REM  This is a part of the Knowledge Xpert for Oracle Administration library.
REM  Copyright (C) 2008 Quest Software
REM  All rights reserved.
REM
REM ******************** Knowledge Xpert for Oracle Administration ********************
UNDEF ENTER_OWNER_NAME
UNDEF ENTER_TABLE_NAME

SET pages 56 lines 132 newpage 0 verify off echo off feedback off
SET serveroutput on
-- when the table is > 10 blocks and
-- total space usage up to the  HWM is < 30% of the size of the HWM, we will consider the table 
-- a candidate for shrinking. 

BEGIN
   DBMS_OUTPUT.put_line
      ('This report produces a list of tables that may benefit from compacting.'
      );
   DBMS_OUTPUT.put_line (CHR (13));

   FOR space_usage IN
      (SELECT /*+ FIRST_ROWS */
              dba_tables.owner, dba_tables.table_name,
              dba_tables.blocks blocks_below,
              dba_segments.blocks total_blocks,
              dba_tables.num_rows * dba_tables.avg_row_len total_data_size,
              ROUND ((  100
                      * (dba_tables.num_rows * dba_tables.avg_row_len)
                      / (GREATEST (dba_tables.blocks, 1) * v$parameter.VALUE)
                     ),
                     3
                    ) hwm_full,
              ROUND ((  100
                      * (dba_tables.num_rows * dba_tables.avg_row_len)
                      / (GREATEST (dba_segments.blocks, 1) * v$parameter.VALUE
                        )
                     ),
                     3
                    ) space_full
         FROM dba_tables, v$parameter, dba_segments
        WHERE dba_tables.owner NOT IN ('SYS', 'SYSTEM')
          AND dba_tables.owner LIKE UPPER ('&&ENTER_OWNER_NAME')
          AND dba_tables.table_name LIKE UPPER ('&&ENTER_TABLE_NAME')
          AND dba_tables.owner = dba_segments.owner
          AND dba_tables.table_name = dba_segments.segment_name
          AND v$parameter.NAME = LOWER ('db_block_size')
          AND (  100
               * (dba_tables.num_rows * dba_tables.avg_row_len)
               / (GREATEST (dba_segments.blocks, 1) * v$parameter.VALUE)
              ) < 30
          AND dba_segments.blocks > 10)
   LOOP
      DBMS_OUTPUT.put_line (   'Candidate table is '
                            || space_usage.owner
                            || '.'
                            || space_usage.table_name
                           );
      DBMS_OUTPUT.put_line (   'Which is using  '
                            || space_usage.space_full
                            || '% of allocated space. '
                           );
      DBMS_OUTPUT.put_line (   'Which is using  '
                            || space_usage.hwm_full
                            || '% of allocated space to the HWM. '
                           );
      DBMS_OUTPUT.put_line ('You can use this script to compact the table:');
      DBMS_OUTPUT.put_line (   'alter table '
                            || space_usage.owner
                            || '.'
                            || space_usage.table_name
                            || ' enable row movement; '
                           );
      DBMS_OUTPUT.put_line (   'alter table '
                            || space_usage.owner
                            || '.'
                            || space_usage.table_name
                            || ' shrink space cascade; '
                           );
      DBMS_OUTPUT.put_line (CHR (13));
   END LOOP;
END;

根据返回的提示信息,来确定是否需要进行碎片的整理


2.2 碎片整理的方法

表的碎片整理的方法有很多种,根据其不同的特性来决定使用哪一种方法进行碎片的整理

1)  alter table xxx move;

2)  alter table xxx shrink;

3)  imp/exp


3.索引的碎片

一个索引块中的数据如果不是全部被删除,那么此块中的空闲空间将不会被重用。如果此块中的数据全部被删除了,那么此块就可以被重用。随着,表的DML操作,索引块中存在的空闲空间使得数据更加分散,扫描索引需要更多次的I/O,降低查询的性能。


3.1 判断索引中是否存在碎片

analyze index index_name validate structure或validate index index_name

analyze index index1 validate structure:是用来分析索引的数据块是否有坏块,以及根据分析得到的

数据(存放在index_stats)來判断索引是否需要重新建立。

运行命令后,然后在视图 index_stats查询,这个视图记录索引的一些信息,这个视图只有一个记录,所以在同一时间

只能分析一个索引。

1)删除的行数如占总的行数的30%,即del_lf_rows/ lf_rows > 0.3,那就考虑索引碎片整理

2)如果”hight“大于4,可以考虑碎片整理

3)如果索引的行数(LF_rows)远远小于‘LF_BLKS’ ,那就说明有了一个大的删除动作,需要整理碎片


3.2 索引碎片整理方法

1)recreate index

2.)alter indexskate.idx_test rebuild nologging parallel 4 online ;

3)如果叶块是half-empty or near empty,可以运行“alter index coalesce”来合并


ballontt
2013/11/25

---The End---

微博:weibo.com/ballontt
如需转载,请标明出处和链接,谢谢!


作者:ballontt 发表于2013-11-25 23:44:17 原文链接
阅读:146 评论:0 查看评论

相关 [fragmentation oracle 碎片] 推荐:

【fragmentation】ORACLE中碎片小结

- - CSDN博客数据库推荐文章
碎片的产生总的来讲是因为不断插入,修改使得产生一些小的无法利用的空闲空间. 碎片根据产生的位置不同分多种情况,其层级关系如下:. 我们这里针对tablespace-level fragmentation(table,index)进行介绍. 因此对于DMT 有必要定期做alter tablespace  coalesce的合并操作, 将小的extents合并成大的extents,减少碎片.

[转]Oracle 碎片

- - 小鸥的博客
  当生成一个数据库时,它会 分成称为表空间( Tablespace )的多个逻辑段( Segment ),如系统( System )表空间 , 临时( Temporary )表空间等. 一个表空间可以包含多个数据范围( Extent )和一个或多个自由范围块,即自由空间( Free Space ).

Oracle 收购 Ksplice

- feng823 - LinuxTOY
实现无需重启即可为 Linux 内核打安全补丁的 Ksplice 被 Oracle 收购. 在被收购前, Ksplice 为 Fedora, Ubuntu 免费提供该功能,对于 RHEL 和 CentOS 则需要订阅其产品. Oracle 表示将把 Ksplice 带来的零宕机安全更新功能添加到 Oracle 产品订阅服务中,同时停止对其他企业级 Linux 发行版的支持,将 Oracle Unbreakable Linux 打造成唯一具备零宕机安全更新功能的企业级 Linux 发行版.

Linux Ksplice,MySQL and Oracle

- Syn - DBA Notes
Oracle 在 7 月份收购了 Ksplice. 使用了 Ksplice 的 Linux 系统,为 Kernel 打补丁无需重启动,做系统维护的朋友应该明白这是一个杀手级特性. 现在该产品已经合并到 Oracle Linux 中. 目前已经有超过 700 家客户,超过 10 万套系统使用了 Ksplice (不知道国内是否已经有用户了.

oracle license计算

- Fenng - eagle&#39;s home
Oracle license的计算是基于CPU core的. 用core的数目乘以一个系数core factor就可以得到所需的oracle license的数目. 对于不同的CPU,core factor是不一样的,可以从oracle提供的这张列表中查到 Oracle Processor Core Factor Table.

Oracle Exadata初探

- - 技术改变世界 创新驱动中国 - 《程序员》官网
在我们看来,它是一个把硬件和软件根据合理的配置整合在一起的 Oracle数据库(在本文编写时是11gR2版本)平台. Exadata数据库机器包含了存储子系统,在存储层上运行着研发的新软件,这使得研发人员可以做一些在其他平台上无法完成的事情. 实际上,Exadata一开始是以一个存储系统形式诞生的,如果你跟参与研发此产品的人交谈,你经常会听到他们称存储组件为Exadata或者是SAGE (Storage Appliance for Grid Environments,网格环境存储设备),这是该产品研发项目的代码名称.

Oracle MySQL Or NoSQL续

- - Sky.Jian 朝阳的天空
接前面一篇,这里再将之前在“中国系统架构师大会”5周年的时候发布的纪念册“IT架构实录”上的一篇文章发出来,也算是前面博文中PPT的一个文字版解读吧. Oracle,MySQL 还是 NoSQL. 随着阿里系的“去IOE”运动在社区的宣传声越来越大,国内正在掀起一股“去xxx”的技术潮. 不仅仅是互联网企业,包括运营商以及金融机构都已经开始加入到这个潮流之中.

oracle 索引

- - 数据库 - ITeye博客
        自动:在使用primary和unique后系统会自动创建唯一索引.         手动:create   index   索引名  on 表名(字段1,....). 查询表上有哪些索引(网上找的,能用,表名和索引名要大写). 1、查找表的所有索引(包括索引名,类型,构成列):. select t.*,i.index_type from user_ind_columns t,user_indexes i where t.index_name = i.index_name and t.table_name = i.table_name and t.table_name = 要查询的表.

Oracle索引

- - Oracle - 数据库 - ITeye博客
在关系数据库中,索引是一种与表有关的数据库结构,它可以使对应于表的SQL语句执行得更快. 索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容. 对于数据库来说,索引是一个必选项,但对于现在的各种大型数据库来说,索引可以大大提高数据库的性能,以至于它变成了数据库不可缺少的一部分. singlecolumnorconcatenated  对一列或多列建所引.

Oracle表空间(tablespaces)

- - 博客园_首页
  我们知道oarcle数据库真正存放数据的是数据文件(data files),Oarcle表空间(tablespaces)实际上是一个逻辑的概念,他在物理上是并不存在的,那么把一组data files 捻在一起就成为一个表空间. 一个数据库可以包含多个表空间,一个表空间只能属于一个数据库. 一个表空间包含多个数据文件,一个数据文件只能属于一个表空间.