当前位置: 首页 > news >正文

这是关于Oracle碎片的文章

碎片产生的原因

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

当表或索引在表空间中频繁地进行DML操作时,表中空闲的数据块(高水位以下)无法被有效的利用,例如一些不连续地空间,无法被有效利用时。数据库的数据块就会产生碎片。

碎片的影响

碎片的产生会导致存储空间利用率低下,并且影响数据库的性能。

以全表扫描为例:

当 Oracle 进行全表扫描(FTS, Full table scan)的操作时,它会读高水位下的所有数据块。当高水位下还有很多空闲空间(碎片),读取这些空闲数据块会降低操作的性能。索引碎片同理(解决办法:重建索引+online)。

产生行链接和行迁移

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

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

  • 行链接&行迁移检测方案
-- 检测方案1:
-- 执行脚本创建chained_rows表
@?/rdbms/admin/utlchain.sql  
-- ‌执行分析命令
ANALYZE TABLE 表名 LIST CHAINED ROWS INTO chained_rows;
-- 确认存在行迁移/链接的记录
SELECT owner_name, table_name, head_rowid 
FROM chained_rows; -- 检测方案2:
-- 分析表
exec dbms_stats.gather_table_stats(ownname=>'HR',tabname=> 'EMPLOYEES');
-- 查看
SELECT table_name, chain_cnt
FROM user_tables
WHERE table_name = 'EMPLOYEES';
TABLE_NAME      CHAIN_CNT
-------------- ----------
EMPLOYEES          891 --产生迁移
  • 解决‌行迁移‌&‌行链接‌思路
    ‌行迁移‌:由UPDATE导致记录超出块空间,需迁移数据(可优化PCTFREE解决)。
    ‌行链接‌:记录长度超块大小(如LOB字段),需调整块大小或拆分表结构

解决方案

1、支持在线操作-在线重定义(dbms_redefinition)

-- 1. 检查表是否可重定义
EXEC DBMS_REDEFINITION.CAN_REDEF_TABLE('SCOTT', 'EMPLOYEES');-- 2. 创建中间表(结构需包含新列或修改后的定义)
CREATE TABLE employees_interim AS SELECT * FROM employees WHERE 1=0;-- 3. 启动重定义
EXEC DBMS_REDEFINITION.START_REDEF_TABLE('SCOTT', 'EMPLOYEES', 'EMPLOYEES_INTERIM');-- 4. 复制依赖对象(可选,不建议使用,结构手动创建更有把控性)
-- 注意:复
http://www.dtcms.com/a/339568.html

相关文章:

  • 空间智能赋能低空经济建设
  • 录音转文字:怎么快速精转提取重点?
  • 【弦乐教程】四 / 五部和声铺底写作指南 —— 从声部配置到禁忌规避
  • 8.19笔记
  • 训练数据转 LMDB 格式:必要性解析与核心优势全指南
  • 假设检验的原理
  • PDR与RSSI融合定位入门:从原理到实践
  • 如何用Prometheus和FastAPI打造任务监控的“火眼金睛”?
  • WSL虚拟机(我的是ubuntu20.04)将系统文件转移到E盘
  • 前端面试核心技术30问
  • 35岁对工作的一些感悟
  • C++常见面试题-6.算法
  • 汉诺塔问题深度解析:递归算法的优雅实现与可视化演示
  • strlen 函数的使用与模拟实现
  • Kubernetes 的 YAML 配置文件-apiVersion
  • Python入门第10课:用Python操作Excel,openpyxl与pandas实用技巧
  • oracle官网下载jdk历史版本,jdk历史版本下载
  • 涡流-信号完整性分析
  • LCC-LCC谐振式无线充电系统控制技术研究的复现
  • VsCode 便携版(绿色版)下载及配置
  • 交换机原理
  • 自建知识库,向量数据库 (十)之 文本向量化——仙盟创梦IDE
  • 牛津大学xDeepMind 自然语言处理(2)
  • 【驱动】RK3576:桌面操作系统基本概念
  • 存储系统中的“脏数据”(Dirty Data)概念及其常见误解
  • uniapp 5+App项目,在android studio模拟器上运行调试
  • 光学件加工厂倚光科技:陪跑光学未来力量
  • 算法——质数筛法
  • 强化学习-CH3 最优状态值和贝尔曼最优方程
  • Spring Cloud——服务注册与服务发现原理与实现