详细聊聊Oracle表碎片对性能有多大的影响


Posted in Oracle onMarch 19, 2022

前言

本文通过对Oracle 表碎片整理,对比了前后对数据库性能的影响。

⛳️ 1.创建测试表

?1.1 建立表空间

SYS@EDB> select TABLESPACE_NAME,FILE_NAME from dba_data_files;

详细聊聊Oracle表碎片对性能有多大的影响

?1.2 创建ASSM表空间

CREATE TABLESPACE “JEAMES” DATAFILE
‘/u01/app/oracle/oradata/EDB/jeames01' SIZE 50M
LOGGING ONLINE PERMANENT BLOCKSIZE 8192
EXTENT MANAGEMENT LOCAL AUTOALLOCATE SEGMENT SPACE MANAGEMENT AUTO

详细聊聊Oracle表碎片对性能有多大的影响

?1.3 创建表及索引

##创建测试表t1,id列创建索引in_t1_id
create table t1 tablespace JEAMES as select level as id from dual connect by level<=300000;
create index in_t1_id on t1(id);
analyze table t1 compute statistics;
select count(*) from t1;

详细聊聊Oracle表碎片对性能有多大的影响

⛳️ 2.查看表统计信息

select sum(bytes)/1024/1024 from dba_segments where segment_name=‘T1';

详细聊聊Oracle表碎片对性能有多大的影响

select sum(bytes)/1024/1024 from dba_segments where segment_name=‘IN_T1_ID';

详细聊聊Oracle表碎片对性能有多大的影响

SELECT blocks, empty_blocks, num_rows FROM user_tables WHERE table_name =‘T1';

详细聊聊Oracle表碎片对性能有多大的影响

总结:

查看表T1,段4M, 占用473个数据块,39个空块,索引IN_T1_ID段6M;

⛳️ 3.空块占用空间

查看没有数据的块占用的空间

DBMS_STATS 包无法获取 EMPTY_BLOCKS 统计信息,所以需要用 analyze 命令再收集一次统计信息,估算表在高水位线下还有多少空间可用 ,这个值应当越低越好,表使用率越接近高水位线,全表扫描所做的无用功也就越少! !

SELECT TABLE_NAME,
(BLOCKS * 8192 / 1024 / 1024) -
(NUM_ROWS * AVG_ROW_LEN / 1024 / 1024) “Data lower than HWM in MB”
FROM USER_TABLES
WHERE table_name = ‘T1';

详细聊聊Oracle表碎片对性能有多大的影响

⛳️ 4.查看执行计划

查看全表扫描cost为131,基于成本

explain plan for select * from t1;
select * from table(dbms_xplan.display);

详细聊聊Oracle表碎片对性能有多大的影响

⛳️ 5.删除大量数据

删除大部分数据,并收集统计信息,查看T1占用数据块和空块都没有减少

delete from t1 where id>10;

详细聊聊Oracle表碎片对性能有多大的影响

analyze table t1 compute statistics;
SELECT blocks, empty_blocks, num_rows FROM user_tables WHERE table_name =‘T1';

详细聊聊Oracle表碎片对性能有多大的影响

⛳️ 6.再次查看执行计划

查看全表扫描cost为125,基于成本, 使用率几乎没有下降

explain plan for select * from t1;
select * from table(dbms_xplan.display);

详细聊聊Oracle表碎片对性能有多大的影响

⛳️ 7.再次空块占用空间

SELECT TABLE_NAME,
(BLOCKS * 8192 / 1024 / 1024) -
(NUM_ROWS * AVG_ROW_LEN / 1024 / 1024) “Data lower than HWM in MB”
FROM USER_TABLES
WHERE table_name = ‘T1';

详细聊聊Oracle表碎片对性能有多大的影响

⛳️ 8.整理表碎片

开启行迁移
alter table t1 enable row movement;
降低水位线
alter table t1 shrink space;
关闭行迁移
alter table t1 disable row movement;
SYS@EDB> select sum(bytes)/1024/1024 from dba_segments where segment_name=‘T1'

详细聊聊Oracle表碎片对性能有多大的影响

SELECT TABLE_NAME,
(BLOCKS * 8192 / 1024 / 1024) -
(NUM_ROWS * AVG_ROW_LEN / 1024 / 1024) “Data lower than HWM in MB”
FROM USER_TABLES
WHERE table_name = ‘T1';

详细聊聊Oracle表碎片对性能有多大的影响

收集统计信息

analyze table t1 compute statistics;

⛳️ 9.效果确认

占用数据块及空闲数据块下降,并且cost使用也下降

SELECT TABLE_NAME,
(BLOCKS * 8192 / 1024 / 1024) -
(NUM_ROWS * AVG_ROW_LEN / 1024 / 1024) “Data lower than HWM in MB”
FROM USER_TABLES
WHERE table_name = ‘T1';

详细聊聊Oracle表碎片对性能有多大的影响

select blocks,empty_blocks,num_rows from user_tables where table_name=‘T1';

详细聊聊Oracle表碎片对性能有多大的影响

explain plan for select * from t1;
select * from table(dbms_xplan.display);

详细聊聊Oracle表碎片对性能有多大的影响

⛳️ 10.技能拓展

1.再用alter table table_name move 时,表相关的索引会失效,
所以之后还要执行 alter index index_name
rebuild online; 最后重新编译数据库所有失效的对象
2. 在用 alter table table_name shrink space cascade 时,
3. 他相当于 alter table table_name move 和
alter index index_name rebuild online. 所以只要编译数据库失效的对象就可以;
4. Move 会移动高水位,但不会释放申请的空间,是在高水位以下(below HWM)的操作。
5. shrink space 同样会移动高水位,
6. 但也会释放申请的空间,是在高水位上下(below and above HWM)都有的操作。
原理不一样,move 是以 block 为单位重组数据,
行的 rowid 都会跟着变化,而 shrink 是以”行“为单位重组
数据,他是根据复杂的算法从逻辑+物理重组数据
move 速度快于 shrink.
Move 相当于 从 segment 底部 move 到 头。
Shrink 相当于先 delete,然后再 insert 这样产生很多 undo,redo
通常首选 MOVE
语法:
alter table <table_name> shrink space [ <null> | compact | cascade ];
alter table <table_name> shrink space compcat;
k 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 释放空闲数据块。shrink 必须开启行迁移功能。

总结

到此这篇关于Oracle表碎片对性能有多大影响的文章就介绍到这了,更多相关Oracle表碎片对性能影响内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Oracle 相关文章推荐
ORACLE查看当前账号的相关信息
Jun 18 Oracle
RPM包方式安装Oracle21c的方法详解
Aug 23 Oracle
Oracle 死锁的检测查询及处理
Sep 25 Oracle
详解Oracle数据库中自带的所有表结构(sql代码)
Nov 20 Oracle
使用Oracle命令进行数据库备份与还原
Dec 06 Oracle
oracle重置序列从0开始递增1
Feb 28 Oracle
Oracle 多表查询基本语法实例
Apr 18 Oracle
SQL试题 使用窗口函数选出连续3天登录的用户
Apr 24 Oracle
Oracle锁表解决方法的详细记录
Jun 05 Oracle
Oracle数据库事务的开启与结束详解
Jun 25 Oracle
Oracle查看表空间使用率以及爆满解决方案详解
Jul 23 Oracle
oracle删除超过N天数据脚本的方法
Feb 28 #Oracle
oracle重置序列从0开始递增1
Feb 28 #Oracle
Oracle 触发器trigger使用案例
Feb 24 #Oracle
Oracle中update和select 关联操作
Jan 18 #Oracle
使用Oracle命令进行数据库备份与还原
Dec 06 #Oracle
详解Oracle数据库中自带的所有表结构(sql代码)
Oracle表空间与权限的深入讲解
Nov 17 #Oracle
You might like
Zend Guard使用指南及问题处理
2015/01/07 PHP
ThinkPHP数据操作方法总结
2015/09/28 PHP
详解Laravel服务容器的绑定与解析
2019/11/05 PHP
jQuery学习笔记(3)--用jquery(插件)实现多选项卡功能
2013/04/08 Javascript
js获取内联样式的方法
2015/01/27 Javascript
JS+CSS实现Li列表隔行换色效果的方法
2015/02/16 Javascript
jQuery简单实现提交数据出现loading进度条的方法
2016/03/29 Javascript
jquery获取img的src值的简单实例
2016/05/17 Javascript
AngularJS使用ng-repeat和ng-if实现数据的删选显示效果示例【适用于表单数据的显示】
2016/12/13 Javascript
简单实现js鼠标跟随效果
2020/08/02 Javascript
解决在vue+webpack开发中出现两个或多个菜单公用一个组件问题
2017/11/28 Javascript
js读取本地文件的实例
2017/12/22 Javascript
浅析JS中什么是自定义react数据验证组件
2018/10/19 Javascript
JavaScript中的回调函数实例讲解
2019/01/27 Javascript
vue项目添加多页面配置的步骤详解
2019/05/22 Javascript
微信小程序wepy框架学习和使用心得详解
2019/05/24 Javascript
使用 Opentype.js 生成字体子集的实例代码详解
2020/05/25 Javascript
Vue中watch、computed、updated三者的区别及用法
2020/07/27 Javascript
nodejs中的异步编程知识点详解
2021/01/17 NodeJs
python获取当前时间对应unix时间戳的方法
2015/05/15 Python
python制作企业邮箱的爆破脚本
2016/10/05 Python
Python中struct模块对字节流/二进制流的操作教程
2017/01/21 Python
python实现创建新列表和新字典,并使元素及键值对全部变成小写
2019/01/15 Python
Python后台开发Django会话控制的实现
2019/04/15 Python
Python命令行参数解析工具 docopt 安装和应用过程详解
2019/09/26 Python
python小程序之4名牌手洗牌发牌问题解析
2020/05/15 Python
python实现图书馆抢座(自动预约)功能的示例代码
2020/09/29 Python
python3字符串输出常见面试题总结
2020/12/01 Python
shallow copy和deep copy的区别
2016/05/09 面试题
中秋寄语大全
2014/04/11 职场文书
应届大学生求职信
2014/07/20 职场文书
运动会演讲稿200字
2014/08/25 职场文书
校长创先争优承诺书
2014/08/30 职场文书
新员工试用期工作总结2015
2015/05/28 职场文书
入党转正介绍人意见
2015/06/03 职场文书
我是特种兵观后感
2015/06/11 职场文书