注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

涅槃

文档收藏

 
 
 

日志

 
 
 
 

【转载】Oracle 数据库整理表碎片(转)  

2014-03-10 21:34:58|  分类: oracle优化 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

from:http://space.itpub.net/?uid-22990797-action-viewspace-itemid-750155

表碎片的来源

当针对一个表的删除操作很多时,表会产生大量碎片。删除操作释放的空间不会被插入操作立即重用,甚至永远也不会被重用。

怎样确定是否有表碎片

-- 收集表统计信息  SQL> exec dbms_stats.gather_table_stats(ownname=>'SCHEMA_NAME',tabname=> 'TABLE_NAME');    -- 确定碎片程度  SQL> SELECT table_name, ROUND ((blocks * 8), 2) "高水位空间 k",     ROUND ((num_rows * avg_row_len / 1024), 2) "真实使用空间 k",     ROUND ((blocks * 10 / 100) * 8, 2) "预留空间(pctfree) k",     ROUND ((  blocks * 8             - (num_rows * avg_row_len / 1024)             - blocks * 8 * 10 / 100            ),            2           ) "浪费空间 k"    FROM dba_tables    WHERE table_name = 'TABLE_NAME';  

或者使用如下gist中的脚本找出某个 Schema 中表碎片超过25%的表。使用此脚本前,先确定 Schema 中表统计信息收集完整。

-- 查看表上次收集统计信息时间  select table_name,last_analyzed from dba_tables where wner = 'SCHEMA_NAME'    -- 收集整个 Schema 中对象的统计信息  SQL> exec dbms_stats.gather_schema_stats(ownname=>'SCHEMA_NAME');  

为什么要整理表碎片

Oracle 对数据段的管理有一个高水位(HWM, High Water Mark)的概念。高水位是数据段中使用过和未使用过的数据块的分界线。高水位以下的数据块是曾使用过的,以上的是从未被使用或初始化过的。

当 Oracle 进行全表扫描(FTS, Full table scan)的操作时,它会读高水位下的所有数据块。如果高水位下还有很多空闲空间(碎片),读取这些空闲数据块会降低操作的性能。

行链接和行迁移

  • 行链接 Row Chaining:当插入数据量大的行的,如果一个Block不能存放一条 记录,该记录的一部分会存储到同个Extent中的其他Block,这些block形成一 个数据块链。
  • 行迁移 Row Migration:当Update的时候导致记录长度增加了,存储的Block已 经满了,就会发生行迁移。Oracle会迁移整行数据到一个能够存储下整行数据 的Block中,迁移的原始指针指向新的存放行数据的Block,ROWID不变。

当数据行发生链接(chain)或迁移(migrate)时,对其访问将会造成 I/O 性能 降低,因为Oracle为获取这些数据行的数据,必须访问更多的数据块(data block)。

表碎片导致的问题

  • 查询响应时间(尤其是全表扫描)变慢
  • 产生大量行迁移
  • 浪费空间

整理表碎片对基于索引的查询不会有太大性能提升。

如何整理表碎片

10g之前

两种方法:

  • 导出表,删除表,再导入表
  • alter table move

一般选择第二种,需要重建索引。

10g后

从 10g 开始,提供一个 shrink 命令,需要表空间是基于自动段管理的。

可以分成两步操作:

-- 整理表,不影响DML操作  SQL> alter table TABLE_NAME shrink space compact;    -- 重置高水位,此时不能有DML操作  SQL> alter table TABLE_NAME shrink space;  

也可以一步到位:

-- 整理表,并重置高水位  SQL> alter table TABLE_NAME shrink space;  

shrink 的优势:

  • 不需要重建索引。
  • 可以在线操作。
  • 不需要空闲空间,alter move需要跟当前表一样大小的空闲空间。
  评论这张
 
阅读(230)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018