oracle 数据库碎片化管理

********************************************************************************
1.表空间碎片
********************************************************************************

----1.查看fsfi值

select a.tablespace_name,
trunc(sqrt(max(blocks)/sum(blocks))* (100/sqrt(sqrt(count(blocks)))),2) fsfi
from dba_free_space  a,dba_tablespaces b
where a.tablespace_name=b.tablespace_name
and b.contents not in('TEMPORARY','UNDO','SYSAUX')
group by A.tablespace_name
order by fsfi; 

如果FSFI小于<30%则表空间碎片太多.

fsfi的最大可能值为100(一个理想的单文件表空间)。随着范围的增加,fsfi值缓慢下降,而随着最大范围尺寸的减少,
fsfi值会迅速下降。

---2.查看dba_free_space

dba_free_space 显示的是有free 空间的tablespace ,如果一个tablespace 的free 空间不连续,
那每段free空间都会在dba_free_space中存在一条记录。如果一个tablespace 有好几条记录,
说明表空间存在碎片,当采用字典管理的表空间碎片超过500就需要对表空间进行碎片整理。

select a.tablespace_name ,count(1) 碎片量 from
dba_free_space a, dba_tablespaces b
where a.tablespace_name =b.tablespace_name
and b.contents not in('TEMPORARY','UNDO','SYSAUX')
group by a.tablespace_name
having count(1) >20
order by 2;

-----3.按照表空间显示连续的空闲空间

========
Script. tfstsfgm
========
SET ECHO off
REM NAME:TFSTSFRM.SQL
REM USAGE:"@path/tfstsfgm"
REM ------------------------------------------------------------------------
REM REQUIREMENTS:
REM    SELECT ON DBA_FREE_SPACE
REM ------------------------------------------------------------------------
REM PURPOSE:
REM    The following is a script. that will determine how many extents
REM    of contiguous free space you have in Oracle as well as the
REM total amount of free space you have in each tablespace. From
REM    these results you can detect how fragmented your tablespace is.
REM
REM    The ideal situation is to have one large free extent in your
REM    tablespace. The more extents of free space there are in the
REM    tablespace, the more likely you  will run into fragmentation
REM    problems. The size of the free extents is also  very important.
REM    If you have a lot of small extents (too small for any next
REM    extent size) but the total bytes of free space is large, then
REM    you may want to consider defragmentation options.
REM ------------------------------------------------------------------------
REM DISCLAIMER:
REM    This script. is provided for educational purposes only. It is NOT
REM    supported by Oracle World Wide Technical Support.
REM    The script. has been tested and appears to work as intended.
REM    You should always run new scripts on a test instance initially.
REM ------------------------------------------------------------------------
REM Main text of script. follows: 

create table SPACE_TEMP (
 TABLESPACE_NAME        CHAR(30),
 CONTIGUOUS_BYTES       NUMBER)
/   

declare
  cursor query is select *
          from dba_free_space
                  order by tablespace_name, block_id;
  this_row        query%rowtype;
  previous_row    query%rowtype;
total           number;   

begin
  open query;
  fetch query into this_row;
  previous_row := this_row;
  total := previous_row.bytes;
  loop
 fetch query into this_row;
     exit when query%notfound;
     if this_row.block_id = previous_row.block_id + previous_row.blocks then
        total := total + this_row.bytes;
        insert into SPACE_TEMP (tablespace_name)
                  values (previous_row.tablespace_name);
     else
        insert into SPACE_TEMP values (previous_row.tablespace_name,
               total);
        total := this_row.bytes;
     end if;
previous_row := this_row;
  end loop;
  insert into SPACE_TEMP values (previous_row.tablespace_name,
                           total);
end;
.
/   

set pagesize 60
set newpage 0
set echo off
ttitle center 'Contiguous Extents Report'  skip 3
break on "TABLESPACE NAME" skip page duplicate
spool contig_free_space.lis
rem
column "CONTIGUOUS BYTES"       format 999,999,999
column "COUNT"                  format 999
column "TOTAL BYTES"            format 999,999,999
column "TODAY"   noprint new_value new_today format a1
rem
select TABLESPACE_NAME  "TABLESPACE NAME",
       CONTIGUOUS_BYTES "CONTIGUOUS BYTES"
from SPACE_TEMP
where CONTIGUOUS_BYTES is not null
order by TABLESPACE_NAME, CONTIGUOUS_BYTES desc;   

select tablespace_name, count(*) "# OF EXTENTS",
         sum(contiguous_bytes) "TOTAL BYTES"
from space_temp
group by tablespace_name;   

spool off   

drop table SPACE_TEMP
/  

********************************************************************************
2.表碎片
********************************************************************************

----方法1:显示碎片率最高的200个表(基于统计信息是否准确)

col frag format 999999.99
col owner format a30;
col table_name format a30;
select * from (
select a.owner,
a.table_name,
a.num_rows,
a.avg_row_len * a.num_rows total_bytes,
sum(b.bytes),
trunc((a.avg_row_len*a.num_rows)/sum(b.bytes),2)*100||'%'  frag
from dba_tables a,dba_segments b
where a.table_name=b.segment_name
and a.owner=b.owner
and a.owner not in
      ('SYS','SYSTEM','OUTLN','DMSYS','TSMSYS','DBSNMP','WMSYS',
       'EXFSYS','CTXSYS','XDB','OLAPSYS','ORDSYS','MDSYS','SYSMAN')
    group by a.owner,a.table_name,a.avg_row_len,a.num_rows
    having a.avg_row_len*a.num_rows/sum(b.bytes)<0.7
    order by sum(b.bytes) desc)
  where rownum<=200;

---方法2:

-- 收集表统计信息
exec dbms_stats.gather_table_stats(ownname=>'SCOTT',tabname=> 'TBLORDERS');

-- 确定碎片程度
SELECT table_name, trunc(ROUND ((blocks * 8), 2)/1024,2) "High water levelM",
   trunc(ROUND ((num_rows * avg_row_len / 1024), 2)/1024,2) "Real  used spaceM",
   trunc(ROUND ((blocks * 10 / 100) * 8, 2)/1024,2) "Reserve space(pctfree) M",
  trunc( ROUND ((  blocks * 8
           - (num_rows * avg_row_len / 1024)
           - blocks * 8 * 10 / 100
          ),
          2
         ) /1024,2) "Waste spaceM"
  FROM dba_tables
  WHERE table_name = 'TBLORDERS';

********************************************************************************
3.索引碎片
********************************************************************************

---1..查看索引高度为2并且索引大小超过20M的索引

select id.tablespace_name,
  id.owner,
  id.index_name,
  id.blevel,
  sum(sg.bytes)/1024/1024,
  sg.blocks,
  sg.extents
from dba_indexes id,dba_segments sg
where id.owner=sg.owner
and id.index_name=sg.segment_name
and id.tablespace_name=sg.tablespace_name
and id.owner not in
      ('SYS','SYSTEM','USER','DBSNMP','ORDSYS','OUTLN')
and sg.extents>100
and id.blevel>=2
group by id.tablespace_name,
id.owner,
id.index_name,
id.blevel,
sg.blocks,
sg.extents
having sum(sg.bytes)/1024/1024>20;

---2.analyze index方法(会锁表)

analyze index index_name validate structure;

select del_lf_rows*100/decode(lf_rows,0,1,lf_rows) pct_deleted from index_stats;

如果pct_deleted>20%说明索引碎片严重.

********************************************************************************
4.automatic segment advisor
********************************************************************************

数据表上频繁的进行插入、更新和删除动作会产生表空间碎片。Oracle可在表或索引上执行Segment shrink。
使得segment的空闲空间可用于表空间中的其它segment,可改善DML性能。

调用Segment Advisor对指定segment执行增长趋势分析以确定哪些Segment受益于Segment shrink。
执行shrink操作,Segment Advisor推荐启用表的ROW MOVEMENT

SQL> alter table scott.tblorders enable row movement;

variable id number;
begin
  declare
  name varchar2(100);
  descr varchar2(500);
  obj_id number;
  begin
  name:='Manual_tblorders';
  descr:='Segment Advisor Example';

  dbms_advisor.create_task (
    advisor_name     => 'Segment Advisor',
    task_id          => :id,
    task_name        => name,
    task_desc        => descr);

  dbms_advisor.create_object (
    task_name        => name,
    object_type      => 'TABLE',
    attr1            => 'SCOTT',
    attr2            => 'TBLORDERS',
    attr3            => NULL,
    attr4            => NULL,
    attr5            => NULL,
    object_id        => obj_id);

  dbms_advisor.set_task_parameter(
    task_name        => name,
    parameter        => 'recommend_all',
    value            => 'TRUE');

  dbms_advisor.execute_task(name);
  end;
end;
/

---删除执行计划
declare name varchar2(100);
begin
  name:='Manual_tblorders';
 DBMS_ADVISOR.DELETE_TASK (name);
 end;
 /

---手动执行计划

declare name varchar2(100);
begin
  name:='Manual_tblorders';
dbms_advisor.execute_task(name);
 end;
 /

NOTE:如果执行计划结果中已经有数据则不能直接手动执行需要删除再执行

---查看手动新建的计划是否已经执行完成

select task_id, task_name, status,advisor_name,created from dba_advisor_tasks
where owner = 'SYS'   and task_name='Manual_tblorders' and advisor_name = 'Segment Advisor' ;

select af.task_name, ao.attr2 segname, ao.attr3 partition, ao.type, af.message
  from dba_advisor_findings af, dba_advisor_objects ao
  where ao.task_id = af.task_id
  and ao.object_id = af.object_id
  and af.task_id=&task_id;

----只查询可以进行shrink操作的对象
select  f.task_name, o.attr2 segname, o.attr3 partition, o.type, f.message
from dba_advisor_findings f, dba_advisor_objects o
where o.object_id = f.object_id
and o.task_name=f.task_name
--and f.message like '%shrink%'
and f.message like '%收缩%'
and f.task_id=&task_id
order by f.impact desc;

---查看automatic segment advisor的recommendations结果

select tablespace_name, segment_name, segment_type, partition_name,
recommendations, c1 from
table(dbms_space.asa_recommendations('FALSE', 'FALSE', 'FALSE'));

********************************************************************************
5. 碎片整理方法
********************************************************************************

------------------------------------------------*
5.1表空间碎片整理
------------------------------------------------*

alter tablespace users coalesce;

------------------------------------------------*
5.2表碎片整理
------------------------------------------------*

---方法1:exo/imp或data pump数据泵技术

---方法2:CTAS

create table newtable as select * from oldtable;

drop table oldtable;

rename table newtable to oldtable;

----方法3:move tablespace技术

alter table <table_name> move tablespace <newtablespace_name>;

----方法4:shrink

alter table <table_name> enable row movement;  

alter table <table_name> shrink space cascade;  --压缩表以及相关数据段并下调HWM

alter table <table_name> shrink space compact;  --只压缩数据不下调HWM,不影响DML操作

alter table <table_name> shrink   space;  --下调HWM,影响DML操作

----方法5:online redefinition

--online redefinition具有的应用场景:

1).Online table redefinition enables you to:

2).Modify the storage parameters of a table or cluster

3).Move a table or cluster to a different tablespace

4).Add or drop partitioning support (non-clustered tables only)

5).Change partition structure

6).Change physical properties of a single table partition, including moving it to a different tablespace in the same schema

7).Change physical properties of a materialized view log or an Oracle Streams Advanced Queueing queue table

8).Add support for parallel queries

9).Re-create a table or cluster to reduce fragmentation

10).Convert a relational table into a table with object columns, or do the reverse.

11).Convert an object table into a relational table or a table with object columns, or do the reverse.

---整理步骤

--步骤1:检测表是否具有按主键进行ONLINE REDIFINITION能力

BEGIN
DBMS_REDEFINITION.CAN_REDEF_TABLE('scott','t1',
      DBMS_REDEFINITION.CONS_USE_PK);
END;
/

--步骤2:新建一张同结构的临时表

create table scott.tp1 tablespace ocpyang
as
select * from scott.t1 where 1=2;

--步骤3:启动ONLINE REDIFINITION

BEGIN
DBMS_REDEFINITION.START_REDEF_TABLE('scott', 't1','tp1',
       '',
       dbms_redefinition.cons_use_pk);
END;
/

--步骤4:Copy dependent objects. (Automatically create any triggers, indexes, materialized view logs,
grants, and constraints on scott.tblorders.)

DECLARE
num_errors PLS_INTEGER;
BEGIN
DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS('scott', 't1','tp1',
   DBMS_REDEFINITION.CONS_ORIG_PARAMS, TRUE, TRUE, TRUE, TRUE, num_errors);
END;
/

--步骤5:检查是否除primary、constraint之外的错误

select object_name, base_table_name, ddl_txt from
DBA_REDEFINITION_ERRORS;

--步骤6:Optionally, synchronize the interim table hr.int_admin_emp.

BEGIN
DBMS_REDEFINITION.SYNC_INTERIM_TABLE('scott', 't1', 'tp1');
END;
/

--步骤7:Complete the redefinition.

BEGIN
DBMS_REDEFINITION.FINISH_REDEF_TABLE('scott', 't1', 'tp1');
END;
/

NOTE:
The table scott.tblorders is locked in the exclusive mode only for a small window toward the end of this step.
After this call the table scott.tblorders is redefined such that it has all the attributes of the scott.tptblorders table.

------------------------------------------------*
5.3 索引碎片整理
------------------------------------------------*

alter index <index_name> rebuild online parallel 4 nologging;

alter table <index_name> coalesce;

由于rebuild index可以在线、并行、不产生日志方式进行.推荐使用rebuild index.

********************************************************************************
6.最佳实践
********************************************************************************

1.针对表的碎片化优先考虑shrink技术;针对索引的碎片优先考虑rebuild index技术;

2.如果shrink不理想则采用online redefinition技术

3.如果空间不够导致rebuild index无法实施则考虑coalesce技术

4.虽然shrink和rebuild index都不影响在线应用但保险起见尽量避免在业务高峰执行

5.shrink技术考虑先压缩数据不下调HWM,然后找业务低谷时间再下调HWM并释放空间

6.建议rebuild index以非ONLINE方式执行虽然支持online.

时间: 2024-11-09 02:36:54

oracle 数据库碎片化管理的相关文章

Toad for Oracle针对于Oracle数据库的可视化管理工具使用

Toad for Oracle安装包下载地址:http://pan.baidu.com/s/1mgBOLZU 在Oracle应用程序的开发过程中,访问数据库对象和编写SQL程序是一件乏味且耗费时间的工作,对数据库进行日常管理也是需要很多SQL脚本才能完成的.Quest Software为此提供了高效的Oracle应用开发工具-Toad(Tools of Oracle Application Developers).在Toad的新版本中,还加入了DBA(Database Administrator

Oracle数据库web维护管理软件

TreeSoft数据库管理系统使用JAVA开发,采用稳定通用的springMVC +JDBC架构,实现基于WEB方式对 MySQL,Oracle,PostgreSQL 等数据库进行维护管理操作. 功能包括:数据库的展示,库表的展示,表字段结构的展示, SQL语句的在线编辑批量执行,表结构的在线设计维护,数据的在线编辑维护,查询语句保存,JSON数据格式化,SQL语法帮助,在线数据源选择配置等.系统内置14套UI皮肤,45套代码编辑区UI方案,使用中可以依个人喜好选择配色方案. 本系统不但稳定,实

Oracle数据库之内存管理

大页内存 备注 备注1:不能使用oracle自动内存管理: 备注2:目的是减少swap的使用: 备注3:建议SGA大于8G: 备注4:只限于linux系统: 备注5:不会使用/dev/shm空间: 备注6:需要设置内存锁: 如果配置了大页内存但没有被oracle使用 1.sga_max_size超过了大页内存: 2.没有设置内存锁: 3.没有取消自动内存管理: 查看系统大页内存的使用情况 cat /proc/meminfo | grep -i HugePages 备注1:一般大页内存的默认大小为

oracle数据库的基本命令管理与操作

启动数据库 查看表空间 查看数据文件 创建一个名为t373的数据文件,大小为10M,设置为自动增长 重置数据文件的大小 查看数据文件重置大小成功 设置数据文件为只读 添加一份数据文件 再次解除只读状态,设置为可读写 添加一个大小为80M的数据文件 添加成功 创建一个mapengfei的用户,密码为123456,默认使用t373的表空间,限额为50M,密码在第一次登陆时失效重置 创建初期是没有相应的登陆数据库的权限的 授予mapengfei用户可以连接数据库的权限,登陆成功 创建一个名字为bene

Oracle数据库——数据库安全性管理

一.涉及内容 1.验证系统权限管理. 2.验证角色管理. 3.验证概要文件管理. 二.具体操作 (一) 1.根据以下要求进行系统权限的授予与回收操作. (1)创建用户user1,并为它授予create table.create view 的系统权限以及connect 的系统角色. (2)以user1用户的身份登录系统. (3)回收user1 的create table.create view 的系统权限. 2. 根据以下要求进行角色的创建与授予操作. (1)创建用户角色myrole. (2)为角

安装部署oracle数据库

部署Oracle数据库 防伪码:宝剑锋从磨砺出,梅花香自苦寒来. 前言:前面我们学习过微软的sqlserver,还有甲骨文公司的mysql,也理解了数据库系统的作用,这两种数据库管理系统适用于软件,网站,游戏等后台数据库,例如我们在学习mysql的时候搭建过动态网站.但oracle属于非常安全.完善的大型数据库管理软件,在电信.银行.证券等大型应用场合拥有着绝对的优势.那么今天就给搭建介绍oracle的安装和基本的使用.Oracle可以安装到windows和linux系统上,但企业更多采用在li

oracle系列(一)”图文+解析”带你部署oracle数据库

博主QQ:819594300 博客地址:http://zpf666.blog.51cto.com/ 有什么疑问的朋友可以联系博主,博主会帮你们解答,谢谢支持! 前言:前面我们学习过微软的sqlserver,还有甲骨文公司的mysql,也理解了数据库系统的作用,这两种数据库管理系统适用于软件,网站,游戏等后台数据库,例如我们在学习mysql的时候搭建过动态网站.但oracle属于非常安全.完善的大型数据库管理软件,在电信.银行.证券等大型应用场合拥有着绝对的优势.那么今天就给搭建介绍oracle的

MySQL/Oracle数据库的基础(二)

MySQL/Oracle数据库 Oracle数据库管理系统是管理数据库访问的计算机软件,由Oracle数据库与Oracle实例构成 Oracle数据库:一个相关的操作系统文件集合,这些文件组织在一起,成为一个逻辑整体,即为Oracle数据库.Oracle数据库必须要与内存实例合作,才能对外提供数据管理服务. Oracle实例:位于物理内存里的数据结构,它由操作系统的多个后台进程和一个共享的内存池所组成,共享的内存池可以被进程锁访问. Oracle用它们来管理数据库访问 Oracle实例就是平常所

Oracle数据库速查知识文档

项目介绍 该项目记录了Oracle相关的速查知识汇总,主要涉及了oracle基础使用.SQL基础.oracle函数.oracle触发器.oracle高级查询.PL/SQL编程基础.PL/SQL存储过程等.若有新增,还将不断添加中. SQL基础部分 1.简介 Oracle Database,又名Oracle RDBMS,或简称Oracle,是甲骨文公司的一款关系数据库管理系统.本课程主要介绍Oracle的SQL基础,包括表空间的概念,如何登录Oracle数据库,如何管理表及表中的数据,以及约束的应