详细聊聊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数据库对long类型字段进行模糊匹配的解决思路
Apr 07 Oracle
oracle表分区的概念及操作
Apr 24 Oracle
mybatis使用oracle进行添加数据的方法
Apr 27 Oracle
oracle通过存储过程上传list保存功能
May 12 Oracle
Oracle创建只读账号的详细步骤
Jun 07 Oracle
ORACLE数据库应用开发的三十个注意事项
Jun 07 Oracle
oracle索引总结
Sep 25 Oracle
Oracle安装TNS_ADMIN环境变量设置参考
Nov 01 Oracle
Lakehouse数据湖并发控制陷阱分析
Mar 31 Oracle
Oracle中DBLink的详细介绍
Apr 29 Oracle
ORACLE中dbms_output.put_line输出问题的解决过程
Jun 28 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
第1次亲密接触PHP5(2)
2006/10/09 PHP
php输入数据统一类实例
2015/02/23 PHP
实例讲解yii2.0在php命令行中运行的步骤
2015/12/01 PHP
PHP不使用递归的无限级分类简单实例
2016/11/05 PHP
php自定义时间转换函数示例
2016/12/07 PHP
php中分页及SqlHelper类用法实例
2017/01/12 PHP
PHP文件管理之实现网盘及压缩包的功能操作
2017/09/20 PHP
php 利用socket发送GET,POST请求的实例代码
2020/07/04 PHP
用js查找法实现当前栏目的高亮显示的代码
2007/11/24 Javascript
从父页面读取和操作iframe中内容方法
2009/07/25 Javascript
javascript appendChild,innerHTML,join性能比较代码
2009/08/29 Javascript
javascript插入样式实现代码
2012/02/22 Javascript
给超链接添加特效鼠标移动展示提示信息且随鼠标移动
2013/10/17 Javascript
利用js实现在浏览器状态栏显示访问者在本页停留的时间
2013/12/29 Javascript
jQuery中设置form表单中action值的实现方法
2016/05/25 Javascript
url中的特殊符号有什么含义(推荐)
2016/06/17 Javascript
angular-ui-sortable实现可拖拽排序列表
2016/12/28 Javascript
JS在浏览器中解析Base64编码图像
2017/02/09 Javascript
js实现悬浮窗效果(支持拖动)
2017/03/09 Javascript
使用vue 国际化i18n 实现多实现语言切换功能
2018/10/11 Javascript
使用webpack搭建vue项目及注意事项
2019/06/10 Javascript
详解javascript中var与ES6规范中let、const区别与用法
2020/01/11 Javascript
JavaScript实现手风琴效果
2021/02/18 Javascript
[13:21]DOTA2国际邀请赛采访专栏:RSnake战队国士无双,Fnatic.Fly
2013/08/06 DOTA
Python统计文件中去重后uuid个数的方法
2015/07/30 Python
Python返回数组/List长度的实例
2018/06/23 Python
简单分析python的类变量、实例变量
2019/08/23 Python
英国现代家具和装饰网站:PN Home
2018/08/16 全球购物
公务员培训心得体会
2013/12/28 职场文书
外企财务年会演讲稿
2014/01/03 职场文书
技术比武方案
2014/05/19 职场文书
销售辞职信范文
2015/03/02 职场文书
医院感染管理制度
2015/08/05 职场文书
Jupyter notebook 不自动弹出网页的解决方案
2021/05/21 Python
Redis集群的关闭与重启操作
2021/07/07 Redis
python数字图像处理:图像的绘制
2022/06/28 Python