Oracle表碎片对性能有多大影响?

简介: Oracle表碎片对性能有多大影响?

⛳️ 1.创建测试表


🐴1.1 建立表空间


SYS@EDB> select TABLESPACE_NAME,FILE_NAME from dba_data_files;


e6ead4e408144df8995ce3ef93777f2b.png


🐴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


573842ac87eb4c58973d2e14526e9b7b.png


🐴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;


5533da896595446c8d98ad91bc789e82.png


⛳️ 2.查看表统计信息


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

27b4b48e931d483ab1fac2f50a88144e.png


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

a3edb12ae557458798a3183efb5886f1.png

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


4454ce087bee4c728207e5765c1ff387.png

总结:

查看表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’;


e9a74aab2c9f40a894f2371763aedabb.png


⛳️ 4.查看执行计划


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

explain plan for select * from t1;

select * from table(dbms_xplan.display);


08fcc5357daf442682fc26d40921048e.png

⛳️ 5.删除大量数据


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

delete from t1 where id>10;

f54def550ee4406aa29d5c030d2b97d5.png

analyze table t1 compute statistics;

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


5d07959fedcf43d78d4f76a50e2899fa.png

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


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

explain plan for select * from t1;

select * from table(dbms_xplan.display);

83b91b58675b4e27a365f4d856d98c0c.png


⛳️ 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’;


ce4c2c5cd7c44d2c9311158072cf71a0.png

⛳️ 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’


b79bf3d3d6b0433c885444ccf34a8d2f.png

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’;


4d9b7154bbfe4969a92b756a1ae358b3.png


收集统计信息

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’;


9144845cc2b242539467db7c271d0d4e.png

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

b9197ee1b30e4be19af58683dfb5dcf5.png

explain plan for select * from t1;

select * from table(dbms_xplan.display);


image.png


⛳️ 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 必须开启行迁移功能。
目录
相关文章
|
6月前
|
Oracle 关系型数据库 数据库
Oracle查询优化-复制表的定义及数据
【1月更文挑战第5天】【1月更文挑战第14篇】在Oracle数据库中,复制表定义和复制表数据是两个常见的操作。
105 1
|
1月前
|
SQL Oracle 关系型数据库
Oracle SQL:了解执行计划和性能调优
Oracle SQL:了解执行计划和性能调优
52 1
|
6月前
|
消息中间件 关系型数据库 Kafka
实时计算 Flink版产品使用合集之oracle cdc 抽取新增一张表 可以从savepoint恢复吗
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
3月前
|
监控 Oracle 关系型数据库
"深度剖析:Oracle SGA大小调整策略——从组件解析到动态优化,打造高效数据库性能"
【8月更文挑战第9天】在Oracle数据库性能优化中,系统全局区(SGA)的大小调整至关重要。SGA作为一组共享内存区域,直接影响数据库处理能力和响应速度。本文通过问答形式介绍SGA调整策略:包括SGA的组成(如数据缓冲区、共享池等),如何根据负载与物理内存确定初始大小,手动调整SGA的方法(如使用`ALTER SYSTEM`命令),以及利用自动内存管理(AMM)特性实现智能调整。调整过程中需注意监控与测试,确保稳定性和性能。
294 2
|
4月前
|
SQL Oracle 关系型数据库
关系型数据库Oracle性能问题
【7月更文挑战第15天】
44 4
|
4月前
|
SQL 缓存 Oracle
关系型数据库Oracle性能问题
【7月更文挑战第16天】
62 2
|
4月前
|
存储 缓存 Oracle
Oracle数据库可扩展性和性能
【7月更文挑战第6天】
83 7
|
5月前
|
SQL Oracle 关系型数据库
实时计算 Flink版产品使用问题之oracle无主键的表支持同步吗如何实现
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
5月前
|
运维 DataWorks Oracle
DataWorks产品使用合集之在标准模式下,当同步Oracle的表或视图时,是否需要在源端的测试和生产环境中都存在要同步的表或视图
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
47 3
|
6月前
|
资源调度 Oracle 关系型数据库
实时计算 Flink版产品使用合集之同步Oracle数据时,一张表产生了大量的连接数,如何处理
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。