Oracle表空间碎片和表碎片?

[复制链接]
查看11 | 回复6 | 2014-7-9 06:00:13 | 显示全部楼层 |阅读模式
有个小型Oracle 10g应用,用了多年数据大概50G,速度也越来越慢,想进行一下数据整理。
但是搞不清表空间碎片和表碎片的区别,按照网上的查询方法貌似都有碎片。使用 alter table XXX shrink SPACE 收缩表后发现统计的数据也没什么变化,想请教是应该先整理表空间,还是整理表,应该用什么样的方法?

回复

使用道具 举报

千问 | 2014-7-9 06:00:13 | 显示全部楼层
表空间碎片-->数据文件碎片-->区碎片,本质上是由于高水位线造成的,因此要降低碎片从你50G的数据量看来,还是找个时间全库导出再导入可以最有效的减少碎片,收缩空间。
此外对于索引碎片Oracle不同于SQL Server,不需要定期重建索引,参考MOS文档ID 1525787.1
另外性能变慢最好出具AWR报告,才能具体分析变慢的原因。
回复

使用道具 举报

千问 | 2014-7-9 06:00:13 | 显示全部楼层
LeoCp 发表于 2016-12-19 09:44
表空间碎片-->数据文件碎片-->区碎片,本质上是由于高水位线造成的,因此要降低碎片从你50G的数据量看来, ...

全库导入导出是不是用 exp/imp 导出再导入数据,这样可以同时减少表碎片和表空间碎片吗?另外收缩是指收缩表还是表空间?两个命令也不同,一个是shrink一个是coalesce
回复

使用道具 举报

千问 | 2014-7-9 06:00:13 | 显示全部楼层
aniven 发表于 2016-12-19 09:50
全库导入导出是不是用 exp/imp 导出再导入数据,这样可以同时减少表碎片和表空间碎片吗?另外收缩是指收 ...

Tom原话如下:
You Asked
Hi Tom,
I've entered the following command to coalesce my 'users' tablespace but it returned
without any coalescing:
alter tablespace users coalesce;
What is the reason?
and we said...
Coalesce simply takes contigous free extents and makes them into a single bigger free
extent.
It is not a reorganization tool.It is a command to take any free extents that are right
next to some other free extent and make one bigger free extent out of them.It is useful
after a drop command when you want to create another object right away.SMON will
normally perform this coalescing in the background but if you need it to happen "right
now", the coalesce command will do it.
我个人也从未使用过alter tablespace coalesce这个语句,从以上回复看此语句只是合并空extent为新的区。
至于你说的收缩到底是指表还是表空间,我只能说是数据文件,表和表空间最终是落实到数据文件上的。
导入导出会在实质上减少区的数目,并改变表在数据文件中的位置。
你说的alter table shrink实质上是收缩段的,也是有效的减少碎片的手段,但是需要2个条件且可能会造成阻塞。
回复

使用道具 举报

千问 | 2014-7-9 06:00:13 | 显示全部楼层
LeoCp 发表于 2016-12-19 10:10
Tom原话如下:
You Asked
Hi Tom,

非常感谢,能否给我一些操作意见,因为并不是实时性很高,周末可以关闭用户连接,因此阻塞问题可以忽略。以下是我的理解和想法:
1. 在时间充足时进行数据导出/导入,完成后再收缩表空间(具体命令还不清楚),同时对应的数据文件也会自动收缩并释放磁盘空间
2. 在时间不够充足时,进对表进行收缩alter table shrink,可能会释放一些可用空间,但数据文件大小不变,还是需要进行表空间收缩达到释放磁盘空间目的
回复

使用道具 举报

千问 | 2014-7-9 06:00:13 | 显示全部楼层
aniven 发表于 2016-12-19 10:45
非常感谢,能否给我一些操作意见,因为并不是实时性很高,周末可以关闭用户连接,因此阻塞问题可以忽略。 ...

1.使用expdp和impdp进行导出后,删掉所有表空间,drop tablespace,然后重建tablespace 添加自动扩展的数据文件,导入后你会发现数据文件大小显著减小,碎片和收缩空间已经解决了,无需额外语句再去收缩数据文件。
2.alter table shrink需要以下2个条件:
1)表必须启用row movement
2)表段所在表空间的段空间管理(segment space management)必须为auto
执行shrink后碎片问题有所缓解,但是需要resize数据文件来释放磁盘空间,而通常是rezise是不会成功的,具体原因我还没试出来,只是猜测shrink不会改变表的初始区,有可能某些表占据了数据文件后端的一些区。
回复

使用道具 举报

千问 | 2014-7-9 06:00:13 | 显示全部楼层
LeoCp 发表于 2016-12-19 11:19
1.使用expdp和impdp进行导出后,删掉所有表空间,drop tablespace,然后重建tablespace 添加自动扩展的数 ...

懂了,对于第一种方式,因为表和索引分布在两个表空间,并且表空间的数据文件分的很多,所以如果我不想动这些文件,是否不需要重建表空间?而只需要把表删除即可?这样导入后磁盘空间并没有变化,不知这样是否有整理的效果?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行