oracle碎片小结

2023-11-01

author:skate

time:2010-05-31


 

 

我们在使用windows的时候,都知道要定期整理磁盘碎片,因为磁盘碎片会影响性能,给管理上带来额外的
负担。那oracle更是如此,当随着数据增加,oracle处理海量数据本身就已经很费力了啊,如果再有大量
的碎片,那就是雪上加霜啊。所以碎片要引起dba的高度重视,尽早发现尽早处理。

 

碎片是怎么产生的呢?


简单理解就是由于更新和删除产生一些碎小的不能被再次使用的空间,根据每种不同的碎片他们的产生也是有区别的

 

block-level的碎片,而block又分为data block和index block,在data block中存放的是row数据,在index block
中存放的是索引键值数据,所以按上面所说,block-level碎片有细分为row-level碎片Index Leaf Block-level碎片


oracle的每一个对象都是存储在segment中,而oracle的最小分配单位是extents(区),在数据更新删除中也会产生碎片
这一级别的碎片就是segment碎片。segment又存在datafile中,而tablespace又是包含datafile的逻辑概念。所以这一层
tablespace-level碎片;tablespace是在disk上存储,所以这一层就是disk-level碎片

 

简单图示如下


disk-level fragmention
  tablespace-level fragmentation
    segment-level fragmentation
      block-level fragmentation
        row-level fragmentation
      index leaf block-level fragmentation

 

顺便提下oracle extents存在的理由

 

一个extents是由多个相连的block组成的,多个extents做成一个segment;extent是oracle的最小分配单位

 

extent的优点:
1. 提高空间分配,释放的效率,降低管理block的资源成本
2. 提高扫描的效率,因为extent是由相连blocks做成的特性,可以一次读取更多的内容,较低io读写次数

 

extent的缺点
容易产生碎片


如何确定产生了碎片的呢?

 

一。表空间碎片确定参考

 

由于自由空间碎片是由几部分组成,如范围数量、最大范围尺寸等,我们可用 FSFI--Free Space Fragmentation Index
(自由空间碎片索引)值来直观体现:

 

  FSFI=100*SQRT(max(extent)/sum(extents))*1/SQRT(SQRT(count(extents)))

 

可以看出,FSFI 的最大可能值为 100 (一个理想的单文件表空间)。随着范围的增加, FSFI 值缓慢下降,而随着最大范
围尺寸的减少,FSFI 值会迅速下降。通过如下语句查询FSFI:

 

select tablespace_name,
       sqrt(max(blocks) / sum(blocks)) * (100 / sqrt(sqrt(count(blocks)))) FSFI
  from dba_free_space
 group by tablespace_name
 order by 1;

 

在一个有着足够有效自由空间,且FSFI 值超过30的表空间中,很少会遇见有效自由空间的问题。当一个空间将要接近
可比参数时,就需要做碎片整理了(DMT空间可以整理,如果是LMT就无法整理)。(SMON 会将相邻的自由范围自动合并)

 

temp表空间(非本地管理表空间)   回收    
  可以将表空间的缺省存储参数pctincrease改为非0。一般将其设为1,如:    
  alter   tablespace   temp   default   storage(pctincrease   1);   

 

 这样smon便会将自由范围自动合并。也可以手工合并自由范围:    
  alter   tablespace   temp   coalesce;  

 

二。segment的碎片整理

 

segment的碎片整理一般主要整理table和index

 

9i之前碎片整理的方法

 

1. exp/truncate/imp

2.
alter table table_name move stroage(initial 1m)
alter index index_name rebuild [tablespace tablespace_name] [nologging] [online]

3.CTAS重组

 

在10g之后,不但可以用以上两种方法,还提供了新的方法

 

alter table <table_name> shrink space [ <null> | compact | cascade ];

 

compact:这个参数当系统的负载比较大时可以用,不降低HWM。如果系统负载较低时,直接用alter table table_name shrink space就一步到位了
cascade:这个参数是在shrink table的时候自动级联索引,相当于rebulid index。

 

普通表

 

shrink必须开启行迁移功能。
alter table table_name enable row movement ;

 

保持HWM,相当于把块中数据打结实了
alter table table_name shrink space compact;

 

回缩表与降低HWM
alter table table_name shrink space;

 

回缩表与相关索引,降低HWM
alter table table_name shrink space cascade;

 

回缩索引与降低HWM
alter index index_name shrink space

 

虽然在10g中可以用shrink ,但也有些限制:

 

1). 对cluster,cluster table,或具有Long,lob类型列的对象 不起作用。
2). 不支持具有function-based indexes 或 bitmap join indexes的表
3). 不支持mapping 表或index-organized表。
4). 不支持compressed 表

 

参考文档:
http://blog.csdn.net/wyzxg/archive/2010/05/28/5631721.aspx

 

从9i开始index碎片的整理除了drop and create index,还可以 alter index skate.t1_idx rebuild nologging parallel 4 online ;

 


表的碎片查找

 

一种笨的方式就是ctas一个表和原来的做下比较,看看空间大小的变化,还有一种就方法就是看视图里数据(要及时analyze才准确)
查看user_tables和user_segments

 

eg:

SQL> select num_rows,blocks,empty_blocks,avg_space,avg_row_len,last_analyzed from user_tables where table_name='TEST1';

  NUM_ROWS     BLOCKS EMPTY_BLOCKS  AVG_SPACE AVG_ROW_LEN LAST_ANALYZED
---------- ---------- ------------ ---------- ----------- -------------
    393216        562           78         23          13 2010-5-27 21:


AVG_SPACE:表示block内的空闲空间大小,根据pctfree参数来参考,这里以默认%10为准,在block=8192里,允许空间的空间是8192 × %10=819.2,也就是说在block剩余空间是819.2时,oracle就认为它是满块了,如果再有数据就要寻找新的block了,当表的AVG_SPACE远远大于819.2时,就说明有碎片了,因为块没有被充分利用,产生block-level碎片。可以通过alter table move来整理。

 

那可以节省多少空间呢?
        
   数据的实际大小=AVG_ROW_LEN × NUM_ROWS=13 × 393216=5111808
          表的实际大小  =BLOCKS × block_size   =562 * 8192 =4603904
                                                     
        

理论上AVG_ROW_LEN × NUM_ROWS <= BLOCKS × block_size 如果相差比较大,那就需要整理,也可以粗略的算下可以节省多少空间,可现在实际上确
AVG_ROW_LEN × NUM_ROWS > BLOCKS × block_size ,不知道的是什么原因?

突然想到我这个test1表里最后一个字段是clob类型的,而clob在数据大于4k时(一个lob字段包括lobindex和lobsegment,),是存储在另外的log segment中的。


而clob类型的d字段没有存储任何数据,查询user_lobs视图

 

SQL> select ul.table_name,ul.segment_name, ul.chunk,se.blocks,se.bytes from user_lobs ul ,user_segments se
  2  where ul.segment_name=se.segment_name
  3  and ul.table_name='TEST1'
  4  ;

TABLE_NAME                     SEGMENT_NAME                        CHUNK     BLOCKS      BYTES
------------------------------ ------------------------------ ---------- ---------- ----------
TEST1                          SYS_LOB0000183465C00004$$            8192          8      65536

 

可这个65536和那两个差值还差很多,再说这8个block还是empty,搞不懂了,谁知道请指点,先谢谢了啊


换个角度会什么样的?我又用CTAS穿件表test4,这回就符合理论值,无论用


alter table table_name move,还是alter table table_name shrink space compact,都是符合理论值的

 

create table test4 as select * from test1


分析后: analyze  table test4 compute statistics

 

SQL> select num_rows,blocks,empty_blocks,avg_space,avg_row_len,last_analyzed from user_tables where table_name='TEST4';

  NUM_ROWS     BLOCKS EMPTY_BLOCKS  AVG_SPACE AVG_ROW_LEN LAST_ANALYZED
---------- ---------- ------------ ---------- ----------- -------------
    393216        802            6        820          12 2010-5-28 12:


   数据的实际大小=AVG_ROW_LEN × NUM_ROWS=13 × 393216=5111808
          表的实际大小  =BLOCKS × block_size   =562 * 8192 =6569984
                                                    

index碎片查找

 

识别索引是否有碎片

 

获得关于索引的信息,用下面的命令


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’ ,那就说明有了一个大的删除动作,需要整理碎片

 

索引碎片整理方法

 

1. recreate index
2. alter index skate.idx_test rebuild nologging parallel 4 online ;
3. 如果叶块是half-empty or near empty,可以运行“alter index coalesce”来合并

 

 

 

 

 

 

 

 

参考:

http://blog.csdn.net/wyzxg/archive/2010/05/31/5637549.aspx

 

 

 

 

 

 

 

-----end-----

 

 

 

 

 

 

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

oracle碎片小结 的相关文章

  • SQL:两个没有完整列匹配的表的并集

    我有一个table A其中有一组列A1 A2和一个具有一组列的 table bB1 B2 碰巧的是A2 B1但其余列不匹配 也不应该匹配 我想附加表格 所以我使用UNION ALL 对于不匹配的列 我使用null as COLUMN NAM
  • 从 Oracle Varchar2 中查找并删除非 ASCII 字符

    我们目前正在将一个 Oracle 数据库迁移到 UTF8 并且发现一些记录接近 4000 字节 varchar 限制 当我们尝试迁移这些记录时 它们会失败 因为它们包含的字符变成了多字节 UF8 字符 我想要在 PL SQL 中做的是找到这
  • Oracle Many OR 与 IN () 的 SQL 性能调优 [重复]

    这个问题在这里已经有答案了 我手头没有 解释计划 您能帮忙判断以下哪一个更有效吗 选项1 select from VIEW ABC where STRING COL AA OR STRING COL BB OR STRING COL BB
  • 如何使用 Java 创建多个模式连接?

    我必须使用两个数据库 DB2 Oracle 我在 DB2 数据库中有一个名为NAVID 我想使用 Java 为 Oracle 中的所有表创建相同的架构 public class automateExport static String va
  • 什么会导致 Oracle ROWID 更改?

    AFAIK Oracle 中的 ROWID 表示相应数据文件中记录的物理位置 在什么情况下记录的ROWID可能会改变 我所知道的一个是分区表上的更新 它将记录 移动 到另一个分区 还有其他情况吗 我们的大多数数据库都是 Oracle 10
  • 如何在Oracle中从表中选择列,*?

    我正在创建很多脚本 有时为了检查表是否根据我的需要进行更新 我会即时编写几个 SELECT 语句 在 SQL SERVER 中你可以这样写 SELECT Column1 FROM MY TABLE 出于可见性原因 这很有用 但是这似乎在 O
  • Oracle 删除约束级联等效于 Sql Server

    在Oracle中 删除约束PK SAI我使用语法 ALTER TABLE SAISIE DROP CONSTRAINT PK SAI CASCADE SQL Server 中与此等效的是什么 您正在考虑与实际 DELETE 语句相关的 FO
  • Oracle 按月滚动或运行总计

    目标 每个月末所有报表的滚动 运行总计 Code select TRUNC ACTHX STMT HX STMT DATE MM AS MNTH COUNT ACTHX INVOICE as STMTS from ACTHX group b
  • 从 PL/SQL 调用 shell 脚本,但 shell 以 grid 用户而非 oracle 身份执行

    我正在尝试使用 Runtime getRuntime exec 从 Oracle 数据库内部执行 shell 脚本 在 Red Hat 5 5 上运行的 Oracle 11 2 0 4 EE CREATE OR REPLACE proced
  • REGEXP_REPLACE - 仅当包含在 () 中时才从字符串中删除逗号

    我在 oracle 论坛网站找到了一个例子 输入字符串 a b c x y z a xx yy zz x WITH t AS SELECT a b c x y z a xx yy zz x col1 FROM dual SELECT t c
  • 使用 Hibernate 将 Oracle 日期映射到 Java 对象

    我收到消息 文字与格式字符串不匹配 例如 以下是 Java 类中的一些方法 public String getDateTime public void setDateTime String date time 以下是该类的 Hibernat
  • 在 terraform 存储库中设置多个逻辑组织的子文件夹的正确方法是什么?

    目前我正在 azure 中开发一个基础设施 其中包括以下内容 资源组 应用网关 应用服务 etc 我所拥有的一切都在一张单曲里main tf我知道这是一个错误的文件 但我想从那里开始 我目前正在尝试将每个部分移到我的存储库中自己的子文件夹中
  • 如何使用 Oracle 移动文本文件

    我有两个问题 1 如何从文件夹中移动文本文件 C Data inbox test txt 目标文件夹 C Data outbox test txt 2 如何获取文件夹中的目录文件列表 C Data inbox 谢谢 Oracle 提供了一个
  • Oracle Text:如何清理用户输入

    如果有人有使用 Oracle 文本的经验 CTXSYS CONTEXT 我想知道当用户想要搜索可能包含撇号的名称时如何处理用户输入 在某些情况下 转义 似乎有效 但对于单词末尾的 s 则不起作用 s 在停用词列表中 因此似乎已被删除 目前
  • 如何在PL/SQL中模拟32位有符号整数溢出?

    您知道如何在 Oracle PL SQL 中模拟 32 位整数溢出吗 例如 2147483647 1 2147483648 or 2147483648 1 212147483647 我尝试了 PLS INTEGER 但它引发了溢出异常 我终
  • ORA-12728: 正则表达式中的范围无效

    我想检查表中是否插入了有效的电话号码 所以我的触发代码在这里 select start index into mob index from gmarg mobile operators where START INDEX substr ne
  • 没有提示指令的直连接中表的顺序是否会影响性能?

    所有基于 SQL 的 RDBMS 10 年前的版本 直接连接查询 没有提示指令 中的表顺序是否会对最佳性能和内存管理产生影响 听说最后一个join应该是最大的表 您的数据库的查询优化器如何处理这种情况 回答你的问题 是的 表的顺序在连接中有
  • 执行 `EXECUTE IMMEDIATE ` Oracle 语句出现错误

    我是 Oracle 的新手 当我执行以下语句时 BEGIN EXECUTE IMMEDIATE SELECT FROM DUAL END 我得到错误为 命令中从第 2 行开始出错 立即开始执行 从双选择 结尾 错误报告 ORA 00911
  • Oracle OLE DB 提供程序未在 SSIS 中列出

    我在 SSIS 和 VS2015 CM 方面遇到问题 我有一个包需要连接 Oracle 来获取一些数据 我安装了适用于 Win64 的 ODAC 和 Oracle 客户端 但看不到提供程序列表中列出的 OLE DB 的 Oracle 提供程
  • CONTAINS 不适用于 Oracle Text

    我在执行此查询时遇到问题 SELECT FROM gob attachment WHERE CONTAINS gob a document java gt 0 它给了我 ORA 29902 error in executing ODCIIn

随机推荐

  • root用户无法启动vscode的解决方法

    root用户无法启动vscode 的解决方法 1 vscode with root 2 解决方法 3 总结 1 vscode with root 今天切换到Ubuntu的root用户进行编码调试 发现VSCode一直无法打开 命令提示和网上
  • Failed to compile with 1 error。Syntax Error: Error: Loading PostCSS Plugin failed: Cannot find modul

    Syntax Error Error Loading PostCSS Plugin failed Cannot find module postcss pxtorem 错误 解决啦 方法 npm i postcss pxtorem 5 1
  • 使用 redux 有哪些原则?

    核心描述 单一数据源 整个应用的全局 state 被存储在一棵 object tree 中 并且这个 object tree 只存在于唯一一个 store 中 State 是只读的 唯一改变 state 的方法就是触发 action act
  • Java生成指定时间段的一个随机时间

    package com tsjsr util import java text SimpleDateFormat import java util Date import junit framework TestCase public cl
  • 数组应用: 找出一组数据中比均值大的数据并输出

    数组应用 找出一组数据中比均值大的数据并输出 问题描述 由键盘输入读取整型数据 数据数量不超过100个 当读取到数据 1时 停止读取数据 并计算这些数据的均值 不包含 1 将大于均值的数据输出 问题分析 给定了数据数量不超过100 若将每个
  • java设计模式---- 适配器模式,手写SpringMVC适配器设计模式

    主文章 所有java设计模式的目录 https blog csdn net grd java article details 122252696 源码位置 码云 https gitee com yin zhipeng design mode
  • seaborn官方文档的一些坑(以tips为例)

    初次接触seaborn的一个问题 Seaborn 是一个基于 matplotlib 且数据结构与 pandas 统一的统计图制作库 主要特点是画风优良 图形类别更加多样 但数据结构依赖pandas库 比matplotlib pyplot少了
  • 转:浅谈HTTP中Get、Post、Put与Delete的区别

    1 GET请求会向数据库发索取数据的请求 从而来获取信息 该请求就像数据库的select操作一样 只是用来查询一下数据 不会修改 增加数据 不会影响资源的内容 即该请求不会产生副作用 无论进行多少次操作 结果都是一样的 2 与GET不同的是
  • Conda安装Postgresql数据库

    conda search postgresql 查询数据库可安装版本 conda install postgresql 12 2 安装12 2版本的postgresql 创建一个新的PostgreSQL数据库集簇 initdb创建一个新的P
  • ruoyi数据权限学习

    思路 用户关联了角色 用户可以关联多个角色 给角色设置数据权限分类 数据权限分类有如下5种 全部数据权限 DATA SCOPE ALL 自定数据权限 DATA SCOPE CUSTOM 部门数据权限 DATA SCOPE DEPT 部门及以
  • Keil MDK的CMSIS USART Driver使用

    前言 本文适用于使用过Keil MDK软件且有一定的单片机开发基础的人员 软件版本 Keil MDK v5 24 硬件开发板 STM32F429I Discovery 预备知识 Keil RTX线程使用 Keil MDK v5新增了pack
  • 即时通-openfire设备SSL证书部署指南

    一 什么是OpenfireOpenfire 采用Java开发 开源的实时协作 RTC 服务器基于XMPP Jabber 协议 您可以使用它轻易的构建高效率的即时通信服务器 Openfire安装和使用都非常简单 并利用Web进行管理 单台服务
  • 英文论文如何看?转自知乎

    SoniaYang 因为去年年中刚完成了我的硕士论文 就来谈点个人经验 不知道你指的文献指的是 期刊论文 or 学术原著 如果是 期刊论文 那就得首先看Abstract 摘要 一般Abstract包括了这篇文章最基本最全面的几个要素 就是整
  • SQL 统计表 b 对应表a个数,并赋值给表a的一个字段

    最近遇到这么个问题 表a 歌单表 music list 表b 歌曲详情表 music detail 一个歌单对应多个歌曲详情 但在表的设计时 没有考虑到在 music list 设置一个字段标记对应的 music detail数据条数 在数
  • 悄悄分享 60 个相见恨晚的神器工具

    让 WebP 图片下载为 PNG 格式 从 Github 批量下载表情包 一键滚动截屏整个网页 助你快速成为 B 站老司机 一键分析网站技术栈 翻录网页视频神器等等 这些功能 都能在 Chrome 中使用件简单实现 不信 你往下看就行了 最
  • Spring Boot集成Swagger3.0,Knife4j导出文档

    文章目录 Spring Boot集成Swagger3 0 Knife4j导出文档 效果展示 如何使用 简要说明 添加依赖 添加配置类 测试接口 token配置位置 问题1 多文件上传 方法一 配置全局参数 方法二 开启动态参数 自定义多个文
  • Callable日常使用

    Callable日常使用 前言 之前在项目中有个多线程校验导入数据的额需求 就想到了callable 既有返回值又可以抛出异常 岂不美哉 工作之余总结下callable的使用 方便后期CV 目录 Callable日常使用 一 自定义call
  • 360安全卫士添加信任区

    系列文章目录 文章目录 系列文章目录 前言 一 添加信任区 二 步骤 1 木马查杀 2 信任区 3 添加信任的文件 总结 前言 360安全卫士经常会误报 虽然有想过卸载360 但他的有些小工具还挺实用 哎 鸡肋啊 一 添加信任区 打开360
  • 上一个说软件测试简单的,已经被面试官问emo了···

    现在已经过了 不会但我会学 就能感动面试官的时代 随着供需关系的变化 不论是对于面试官还是面试者 面试的成本越来越高 为了筛选到更优秀的程序员 面试官们可谓是绞尽了脑汁 面试造火箭 工作拧螺丝 的传言也不是空穴来风 那些面试官最喜欢的就是你
  • oracle碎片小结

    author skate time 2010 05 31 我们在使用windows的时候 都知道要定期整理磁盘碎片 因为磁盘碎片会影响性能 给管理上带来额外的负担 那oracle更是如此 当随着数据增加 oracle处理海量数据本身就已经很