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

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

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

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

收集表的统计信息

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

查询高水位表信息

/* 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;

查看上次收集的统计时间

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

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

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

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

查询响应时间(尤其是全表扫描)变慢

产生大量行迁移

浪费空间

如何解决高水位问题?

10g之前有两种方式

导出表,删除表,再导入表

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执行的两个阶段:

数据重组(compact):通过一系列insert、delete操作,将数据尽量排列在段的前面。在这个过程中需要在表上加RX锁,即只在需要移动的行上加锁。由于涉及到rowid的改变,需要enable row movement.同时要disable基于rowid的trigger.这一过程对业务影响比较小。

HWM调整:第二阶段是调整HWM位置,释放空闲数据块。此过程需要在表上加X锁,会造成表上的所有DML语句阻塞。在业务特别繁忙的系统上可能造成比较大的影响。

注意:shrink space语句两个阶段都执行。shrink space compact只执行第一个阶段。如果系统业务比较繁忙,可以先执行shrink space compact重组数据,然后在业务不忙的时候再执行shrink space降低HWM释放空闲数据块。

原文:https://www.cnblogs.com/fubinhnust/p/9925731.html

oracle的高水位和低水位实验,Oracle 高水位问题相关推荐

  1. oracle 9i hwm,Oracle中的Low HWM与 High HWM 高水位

    在MSSM的FREELIST下, 高水位High Water Mark代表所有相关块, 高水位以上就是未格式化unformatted 的数据块,INSRT数据时不能直接使用.当FREELIST中不包含 ...

  2. Oracle 21版Database In-Memory LivaLabs实验(上)

    概述 目前Oracle LiveLabs上关于Oracle Database In-Memory的内容已更新,主要变化为: 数据库使用21c 增加了对21c原生JSON的实验 增加了21c AIM H ...

  3. 数据库高可用架构(MySQL、Oracle、MongoDB、Redis)

    一.MySQL MySQL小型高可用架构 方案:MySQL双主.主从 + Keepalived主从自动切换 服务器资源:两台PC Server 优点:架构简单,节省资源 缺点:无法线性扩展,主从失败之 ...

  4. System.Data.OracleClient 需要 Oracle 客户端软件 8.1.7 或更高版本?

    System.Data.OracleClient 需要 Oracle 客户端软件 8.1.7 或更高版本? 环境: Win XP SP2+Oracle 10 g+VS 2005 错误:System.D ...

  5. oracle可以使用提交完成的事务,【体系结构】Oracle数据提交与事务隔离实验 oradebug挂起lgwr进程...

    Oracle数据提交与事务隔离实验 oradebug挂起lgwr进程 原文作者:dbsnake 崔华 实验参考原文链接: Oracle 里未 commit 的数据除了当前 session 之外,其他 ...

  6. oracle 12 问题:需要 Oracle 客户端软件 8.1.7 或更高版本

    环境:win server 2008 r2 oracle 12C 错误提示: System.Web.Services.Protocols.SoapException: 服务器无法处理请求. ---&g ...

  7. oracle创建自身连接,oracle菜鸟学习之 自连接查询实验

    oracle菜鸟学习之 自连接查询实验 实验表的创建 表字段说明: id:员工编号 name:员工名字 ano:管理人员编号 create table admin(id varchar2(4),nam ...

  8. oracle安装实验,Oracle之课程实验一(安装oracle)

    课程名称:Oracle11g数据库应用简明教程 实验题目:实验一安装数据库 姓名:李日中 学号:2010324264班级:10计本3班 实验日期:2013-4-10 成绩: 一. 实验目的 安装数据库 ...

  9. .net调用Oracle 报错:System.Data.OracleClient 需要 Oracle 客户端软件 8.1.7 或更高版本问题

    我又重拾.net搞一搞.老本行了,不过现在已投奔java阵营. 用visual studio 2022运行asp.net程序,结果在读取数据库的时候报错: .net调用Oracle 报错:System ...

最新文章

  1. 解决jre生成错误的问题
  2. AndroidのActivity之退出返回栈(二)
  3. 写代码之前应该做的几件事
  4. java jconsole_java中jconsole命令的学习
  5. 【C语言】数据结构C语言版 实验6 树
  6. [转贴]网页及其控件的触发事件
  7. java web html5区别_html5和html有什么区别啊?
  8. 开源中国源码学习(八)——枚举类
  9. 三种方式解决vue中v-html元素中标签样式
  10. 发达国家“互联网+”面面观
  11. LabVIEW入门教程
  12. 五色电阻在线计算机,色环电阻(5色环在线电阻计算器)
  13. qpython3怎么运行代码_关于使用qpython和qpython3写程序
  14. 蓝牙BQB证后还会被查的3种情况,蓝牙组织审查
  15. 使用ODBC访问数据库(一)
  16. window10 安装语言包出现“很抱歉,我们无法安装此功能。你可以稍后重试。错误代码: 0x80070422”
  17. 软考中级数据库系统工程师好考吗?
  18. 我的ASP.NET MVC5工程中textarea的宽度为啥最大只能280px?
  19. python3程序设计基础答案刘德山_北京大学出版社《Java程序设计案例教程》答案【python程序设计案例教程微课版答案】...
  20. 《老罗的Android之旅》专栏目录

热门文章

  1. nginx总结二(nginx的启动停止以及版本平滑升级)
  2. [转]另一个SqlParameterCollection 中已包含 SqlParameter[解决方案]
  3. linux tac sed,Day08 - 一些常用 Linux 指令 - 3-7 (cat、tac、head、tail、vi、sed)
  4. 一个简单的动态内表alv案例
  5. ABAP 7.4 新语法-内嵌生命和内表操作
  6. 这些名言都是有后半句的,以前都按前半句理解,太坑人!
  7. 笔记本电源适配器的选择方法
  8. Function ALV可编辑列修改数据后与与内表数据同步问题
  9. 税务审计SAP需要用表
  10. Nginx变身爆火神器,手把手教你在永洪BI中应用