博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Oracle 高水位问题
阅读量:6441 次
发布时间:2019-06-23

本文共 1927 字,大约阅读时间需要 6 分钟。

  • Oracle 对数据段的管理有一个高水位(HWM, High Water Mark)的概念。高水位是数据段中使用过和未使用过的数据块的分界线。高水位以下的数据块是曾使用过的,以上的是从未被使用或初始化过的。
  • 当 Oracle 进行全表扫描(FTS, Full table scan)的操作时,它会读高水位下的所有数据块。如果高水位下还有很多空闲空间(碎片),读取这些空闲数据块会降低操作的性能。
  • 当针对一个表的删除操作很多时,表会产生大量碎片。删除操作释放的空间不会被插入操作立即重用,甚至永远也不会被重用,这被称之为高水位问题;

如何检查表是否有高水位问题?

  1. 收集表的统计信息
SQL> exec dbms_stats.gather_table_stats(ownname=>'SCHEMA_NAME',tabname=> 'TABLE_NAME');
  1. 查询高水位表信息
/* Formatted on 2017/9/21 14:14:37 (QP5 v5.240.12305.39476) */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 USER_TABLES WHERE TEMPORARY = 'N' ORDER BY 5 DESC;
  1. 查看上次收集的统计时间
select table_name,last_analyzed from dba_tables where owner = 'SCHEMA_NAME'
  1. 收集整个 Schema 中对象的统计信息
SQL> exec dbms_stats.gather_schema_stats(ownname=>'SCHEMA_NAME');

高水位问题会产生什么不好的影响?

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

如何解决高水位问题?

10g之前有两种方式

  1. 导出表,删除表,再导入表
  2. alter table move (一般选择第二种,但是不能在线进行而且需要重建索引)

10g之后

提供 shrink 命令,需要表空间是基于自动段管理的,分两步走:

  • 第一步:整理表,不影响DML操作
alter table TABLE_NAME enable ROW MOVEMENT;--启动行移动功能alter table TABLE_NAME shrink space compact; --只整理碎片 不回收空间
  • 第二步:重置高水位,此时不能有DML操作
alter table TABLE_NAME shrink space; --整理碎片并回收空间,并调整水位线。业务少时执行alter table TABLE_NAME disable ROW MOVEMENT;--关闭行移动

也可以一步到位:

alter table TABLE_NAME shrink space;

shrink 的优势:不需要重建索引。可以在线操作。

注意 :segment shrink执行的两个阶段:

  1. 数据重组(compact):通过一系列insert、delete操作,将数据尽量排列在段的前面。在这个过程中需要在表上加RX锁,即只在需要移动的行上加锁。由于涉及到rowid的改变,需要enable row movement.同时要disable基于rowid的trigger.这一过程对业务影响比较小。
  2. HWM调整:第二阶段是调整HWM位置,释放空闲数据块。此过程需要在表上加X锁,会造成表上的所有DML语句阻塞。在业务特别繁忙的系统上可能造成比较大的影响。
  • 注意:shrink space语句两个阶段都执行。shrink space compact只执行第一个阶段。如果系统业务比较繁忙,可以先执行shrink space compact重组数据,然后在业务不忙的时候再执行shrink space降低HWM释放空闲数据块。

转载于:https://www.cnblogs.com/fubinhnust/p/9925731.html

你可能感兴趣的文章
字符串转double算法
查看>>
seleect io模型的select操作封装
查看>>
记一次使用dockerfile安装debian并安装好vim,netstat等工具
查看>>
【LeetCode】141 Linked List Cycle (java实现)
查看>>
动态设置软键盘打开会关闭
查看>>
便携式能源设备
查看>>
云盘发展方向研究和总结
查看>>
xcodebuild和xcrun自动化编译ipa包 笔记
查看>>
Spring 的启动过程
查看>>
livereload的使用
查看>>
js判断页面值是否被改变
查看>>
【Linux 系统编程】常用的一些基本命令
查看>>
VUE实现的一个简单分页表格
查看>>
spring4.0 整合 Quartz 实现任务调度(一)
查看>>
android复杂布局的一点思路
查看>>
Awesome Python
查看>>
java web简单权限管理设计
查看>>
Google Analytics
查看>>
【转】什么是云计算
查看>>
MySQL 5.7及以上解压缩版本配置安装
查看>>