Oracle 数据库整理表碎片

发布时间:2020-08-08 00:37:33 作者:Davis_itpub
来源:ITPUB博客 阅读:175

表碎片的来源

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

怎样确定是否有表碎片

-- 收集表统计信息

SQL> exec dbms_stats.gather_table_stats(ownname=>'SCHEMA_NAME',tabname=> 'TABLE_NAME');

[@more@]

-- 确定碎片程度

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

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 = 'BP_RESERVE_ORDERLIST';

-- 查看表上次收集统计信息时间

select table_name,last_analyzed from dba_tables where owner = 'SCHEMA_NAME'

-- 收集整个 Schema 中对象的统计信息

SQL> exec dbms_stats.gather_schema_stats(ownname=>'SCHEMA_NAME');

为什么要整理表碎片

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

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

行链接和行迁移

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

表碎片导致的问题

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

如何整理表碎片

10g之前

两种方法:

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

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需要跟当前表一样大小的空闲空间。
推荐阅读:
  1. oracle 表碎片整理
  2. oracle如何查询表碎片

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

oracle 数据库 整理

上一篇:【MySQL】如何快速执行 binlog

下一篇:sqlserver关于filestream文件流、filetable文件表的总结

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》