详细聊聊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 DGMGRL ORA-16603报错的解决方法(DG Broker)
Apr 06 Oracle
Oracle 数据仓库ETL技术之多表插入语句的示例详解
Apr 12 Oracle
Oracle 区块链表创建过程详解
May 15 Oracle
Oracle更换为MySQL遇到的问题及解决
May 21 Oracle
Oracle以逗号分隔的字符串拆分为多行数据实例详解
Jul 16 Oracle
oracle连接ODBC sqlserver数据源的详细步骤
Jul 25 Oracle
oracle索引总结
Sep 25 Oracle
使用Oracle命令进行数据库备份与还原
Dec 06 Oracle
排查并解决Oracle sysaux表空间异常增长
Apr 20 Oracle
Oracle用户管理及赋权
Apr 24 Oracle
Oracle锁表解决方法的详细记录
Jun 05 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伪静态写法附代码
2008/06/20 PHP
修改PHP脚本使WordPress拦截垃圾评论的方法示例
2015/12/10 PHP
thinkphp 验证码 的使用小结
2017/05/07 PHP
PHP实现下载远程图片保存到本地的方法
2017/06/19 PHP
PHP实现正则匹配所有括号中的内容
2018/06/22 PHP
PHP中引用类型和值类型功能与用法示例
2019/02/26 PHP
根据判断浏览器类型屏幕分辨率自动调用不同CSS的代码
2007/02/22 Javascript
jquery怎样实现ajax联动框(一)
2013/03/08 Javascript
关于事件mouseover ,mouseout ,mouseenter,mouseleave的区别
2015/10/12 Javascript
省市选择的简单实现(基于zepto.js)
2016/06/21 Javascript
BootStrap Datetimepicker 汉化的实现代码
2017/02/10 Javascript
微信小程序注册60s倒计时功能 使用JS实现注册60s倒计时功能
2017/08/16 Javascript
聊聊那些使用前端Javascript实现的机器学习类库
2017/09/18 Javascript
vue keep-alive请求数据的方法示例
2018/05/16 Javascript
JS打印彩色菱形的实例代码
2018/08/15 Javascript
Element实现表格分页数据选择+全选所有完善批量操作
2019/06/07 Javascript
vue项目强制清除页面缓存的例子
2019/11/06 Javascript
[31:00]2014 DOTA2华西杯精英邀请赛5 24 NewBee VS iG
2014/05/25 DOTA
[16:14]教你分分钟做大人:米拉娜(HEROS)
2014/11/24 DOTA
介绍Python的@property装饰器的用法
2015/04/28 Python
Python设置在shell脚本中自动补全功能的方法
2018/06/25 Python
Django在admin后台集成TinyMCE富文本编辑器的例子
2019/08/09 Python
jupyter notebook 多行输出实例
2020/04/09 Python
TensorFlow tf.nn.softmax_cross_entropy_with_logits的用法
2020/04/19 Python
python 如何调用远程接口
2020/09/11 Python
python 获取字典特定值对应的键的实现
2020/09/29 Python
size?荷兰官方网站:英国高级运动鞋精品店
2020/07/24 全球购物
判断单链表中是否存在环
2012/07/16 面试题
研讨会主持词
2014/04/02 职场文书
教师自我剖析材料(群众路线)
2014/09/29 职场文书
钳工实训报告总结
2014/11/04 职场文书
党员心得体会范文2016
2016/01/23 职场文书
用Python远程登陆服务器的步骤
2021/04/16 Python
Python采集爬取京东商品信息和评论并存入MySQL
2022/04/12 Python
nginx之内存池的实现
2022/06/28 Servers
CSS使用SVG实现动态分布的圆环发散路径动画
2022/12/24 HTML / CSS