详细聊聊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表分区的概念及操作
Apr 24 Oracle
ORACLE查看当前账号的相关信息
Jun 18 Oracle
使用Oracle跟踪文件的问题详解
Jun 28 Oracle
快速学习Oracle触发器和游标
Jun 30 Oracle
Oracle 临时表空间SQL语句的实现
Sep 25 Oracle
oracle删除超过N天数据脚本的方法
Feb 28 Oracle
分析SQL窗口函数之排名窗口函数
Apr 21 Oracle
Oracle用户管理及赋权
Apr 24 Oracle
解决Oracle数据库用户密码过期
May 11 Oracle
ORACLE中dbms_output.put_line输出问题的解决过程
Jun 28 Oracle
oracle delete误删除表数据后如何恢复
Jun 28 Oracle
oracle设置密码复杂度及设置超时退出的功能
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
PHP调用API接口实现天气查询功能的示例
2017/09/21 PHP
利用PHP计算有多少小于当前数字的数字方法示例
2020/08/26 PHP
jQuery 学习 几种常用方法
2009/06/11 Javascript
javascript处理table表格的代码
2010/12/06 Javascript
jquery uaMatch源代码
2011/02/14 Javascript
用Javascript评估用户输入密码的强度(Knockout版)
2011/11/30 Javascript
浅析showModalDialog数据缓存问题(用禁止浏览器缓存解决)
2013/07/09 Javascript
js阻止默认事件与js阻止事件冒泡示例分享 js阻止冒泡事件
2014/01/27 Javascript
JQuery插件jcarousellite的参数中文说明
2015/05/11 Javascript
学习javascript面向对象 掌握创建对象的9种方式
2016/01/04 Javascript
javaScript给元素添加多个class的简单实现
2016/07/20 Javascript
Angular指令封装jQuery日期时间插件datetimepicker实现双向绑定示例
2017/01/22 Javascript
JS常见创建类的方法小结【工厂方式,构造器方式,原型方式,联合方式等】
2017/04/01 Javascript
jquery中$.fn和图片滚动效果实现的必备知识总结
2017/04/21 jQuery
深入理解JavaScript创建对象的多种方式以及优缺点
2017/06/01 Javascript
nodejs接入阿里大鱼短信验证码的方法
2017/07/10 NodeJs
在vue中使用vue-echarts-v3的实例代码
2018/09/13 Javascript
Python解决两个整数相除只得到整数部分的实例
2018/11/10 Python
使用Python在Windows下获取USB PID&amp;VID的方法
2019/07/02 Python
python装饰器代替set get方法实例
2019/12/19 Python
python中count函数简单用法
2020/01/05 Python
解决Tensorflow 内存泄露问题
2020/02/05 Python
纽约的奢华内衣店:Journelle
2016/07/29 全球购物
理肤泉俄罗斯官网:La Roche-Posay俄罗斯
2018/07/24 全球购物
印度排名第一的蛋糕、鲜花和礼品送货:Winni
2019/08/02 全球购物
芭比波朗加拿大官方网站:Bobbi Brown Cosmetics CA
2020/11/05 全球购物
安全标兵事迹材料
2014/08/17 职场文书
手机被没收的检讨书
2014/10/04 职场文书
2014年党员个人工作总结
2014/12/02 职场文书
优秀党支部申报材料
2014/12/24 职场文书
教师节寄语2015
2015/03/23 职场文书
门店店长岗位职责
2015/04/14 职场文书
2016反腐倡廉警示教育心得体会
2016/01/13 职场文书
小学三年级数学教学反思
2016/02/16 职场文书
低端且暴利的线上线下创业项目分享
2019/09/03 职场文书
python自动获取微信公众号最新文章的实现代码
2022/07/15 Python