详细聊聊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覆盖导入dmp文件的2种方法
May 21 Oracle
使用Navicat Premium工具将oracle数据库迁移到MySQL
May 27 Oracle
Oracle以逗号分隔的字符串拆分为多行数据实例详解
Jul 16 Oracle
Oracle 临时表空间SQL语句的实现
Sep 25 Oracle
oracle删除超过N天数据脚本的方法
Feb 28 Oracle
Lakehouse数据湖并发控制陷阱分析
Mar 31 Oracle
详解SQL的窗口函数
Apr 21 Oracle
分析SQL窗口函数之取值窗口函数
Apr 21 Oracle
Oracle用户管理及赋权
Apr 24 Oracle
oracle数据库去除重复数据
May 20 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
PHP数组循环操作详细介绍 附实例代码
2013/02/03 PHP
服务器迁移php版本不同可能诱发的问题
2015/12/22 PHP
php array_key_exists() 与 isset() 的区别
2016/10/24 PHP
jquery中邮箱地址 URL网站地址正则验证实例代码
2013/09/15 Javascript
如何学习Javascript入门指导
2013/11/01 Javascript
让jQuery与其他JavaScript库并存避免冲突的方法
2013/12/23 Javascript
javascript删除一个html元素节点的方法
2014/12/20 Javascript
jQuery实现ctrl+enter(回车)提交表单
2015/10/19 Javascript
jQuery子元素过滤选择器用法示例
2016/09/09 Javascript
探索Vue.js component内容实现
2016/11/03 Javascript
NodeJS收发GET和POST请求的示例代码
2017/08/25 NodeJs
完美解决手机网页中输入框被输入法遮挡的问题
2017/12/19 Javascript
浅谈Node 调试工具入门教程
2018/03/20 Javascript
vue文件树组件使用详解
2018/03/29 Javascript
详解关于html,css,js三者的加载顺序问题
2019/04/10 Javascript
React中阻止事件冒泡的问题详析
2019/04/12 Javascript
jQuery模拟html下拉多选框的原生实现方法示例
2019/05/30 jQuery
vue解决花括号数据绑定不成功的问题
2019/10/30 Javascript
Laravel 如何在blade文件中使用Vue组件的示例代码
2020/06/28 Javascript
[04:42]5分钟带你了解什么是DOTA2(第一期)
2017/02/07 DOTA
[02:27]2018DOTA2亚洲邀请赛赛前采访-OpTic
2018/04/03 DOTA
在Python中操作字符串之startswith()方法的使用
2015/05/20 Python
只需7行Python代码玩转微信自动聊天
2019/01/27 Python
python求平均数、方差、中位数的例子
2019/08/22 Python
python3 requests库文件上传与下载实现详解
2019/08/22 Python
keras自定义回调函数查看训练的loss和accuracy方式
2020/05/23 Python
浅析python实现动态规划背包问题
2020/12/31 Python
加拿大购物频道:The Shopping Channel
2016/07/21 全球购物
EMPHASIS艾斐诗官网:周生生旗下原创精品珠宝品牌
2020/12/17 全球购物
成考报名单位证明范本
2014/01/16 职场文书
餐厅楼面主管岗位职责范本
2014/02/16 职场文书
代理协议书
2014/04/22 职场文书
2015年全国爱耳日活动总结
2015/02/27 职场文书
计划生育个人总结
2015/03/02 职场文书
来探秘“德国中小企业”的成功之道
2019/07/26 职场文书
导游词之铁岭象牙山
2019/12/06 职场文书