关于ORACLE碎片的理解和解决办法

本文介绍两种数据库碎片整理的方法:一种是使用expimp工具通过导出并重新导入数据的方式,另一种是利用SQL脚本直接在数据库内操作。这两种方法都能有效地减少数据库的空间碎片,提高数据的存储效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

采用两种方法:exp imp 和 SQL脚本整理

---- 我们知道,段由范围组成。在有些情况下,有必要对段的碎片进行整理。要查看段的有关信息,可查看数据字典 dba_segments ,范围的信息可查看数据字典 dba_extents 。如果段的碎片过多, 将其数据压缩到一个范围的最简单方法便是用正确的存储参数将这个段重建,然后将旧表中的数据插入到新表,同时删除旧表。这个过程可以用 Import/Export (输入 / 输出)工具来完成。
---- Export ()命令有一个(压缩)标志,这个标志在读表时会引发 Export 确定该表所分配的物理空间量,它会向输出转储文件写入一个新的初始化存储参数 -- 等于全部所分配空间。若这个表关闭, 则使用 Import ()工具重新生成。这样,它的数据会放入一个新的、较大的初始段中。例如:
exp user/password file=exp.dmp compress=Y grants=Y indexes=Y
tables=(table1,table2);
---- 若输出成功,则从库中删除已输出的表,然后从输出转储文件中输入表:
imp user/password file=exp.dmp commit=Y buffer=64000 full=Y
---- 这种方法可用于整个数据库。
---- 我们知道,段由范围组成。在有些情况下,有必要对段的碎片进行整理。要查看段的有关信息,可查看数据字典 dba_segments ,范围的信息可查看数据字典 dba_extents 。如果段的碎片过多, 将其数据压缩到一个范围的最简单方法便是用正确的存储参数将这个段重建,然后将旧表中的数据插入到新表,同时删除旧表。这个过程可以用 Import/Export (输入 / 输出)工具来完成。
---- Export ()命令有一个(压缩)标志,这个标志在读表时会引发 Export 确定该表所分配的物理空间量,它会向输出转储文件写入一个新的初始化存储参数 -- 等于全部所分配空间。若这个表关闭, 则使用 Import ()工具重新生成。这样,它的数据会放入一个新的、较大的初始段中。例如:
exp user/password file=exp.dmp compress=Y grants=Y indexes=Y
tables=(table1,table2);
---- 若输出成功,则从库中删除已输出的表,然后从输出转储文件中输入表:
imp user/password file=exp.dmp commit=Y buffer=64000 full=Y

第二种
---- 这种方法可用于整个数据库。
--存储过程
tmp_val VARCHAR2 (500);
BEGIN
    --1.整理空间碎片;
    FOR REC IN (SELECT TABLE_NAME FROM USER_TABLES )
    LOOP
        tmp_val:='ALTER TABLE '||REC.TABLE_NAME ||' MOVE';
        BEGIN
        EXECUTE IMMEDIATE tmp_val;
        DBMS_OUTPUT.put_line (tmp_val);
        EXCEPTION
        WHEN OTHERS
        THEN
        DBMS_OUTPUT.put_line ('Error: ' || tmp_val || '!');
        END;
    END LOOP;
    --2.把索引重建(碎片整理后,很多索引会变成UNUSABLE状态,必须重建后,让它变成void状态)
    FOR REC IN (SELECT INDEX_NAME FROM USER_INDEXES ) --WHERE STATUS='UNUSABLE'
        LOOP
        tmp_val:='ALTER INDEX '||REC.INDEX_NAME ||' REBUILD';
        BEGIN
        EXECUTE IMMEDIATE tmp_val;
        DBMS_OUTPUT.put_line (tmp_val);
        EXCEPTION
        WHEN OTHERS
        THEN
        DBMS_OUTPUT.put_line ('Error: ' || tmp_val || '!');
        END;
    END LOOP;

END;


查看使用情况

---- 由于自由空间碎片是由几部分组成,如范围数量、最大范围尺寸等,我们可用 FSFI--Free Space Fragmentation Index (自由空间碎片索引)值来直观体现:
FSFI=100*SQRT(max(extent)/sum(extents))*1/SQRT(SQRT(count(extents))) 

select tablespace_name,sqrt(max(blocks)/sum(blocks))*(100/sqrt(sqrt(count(blocks)))) FSFI from dba_free_space
group by tablespace_name order by 1;

统计出了数据库的 FSFI 值,就可以把它作为一个可比参数。在一个有着足够有效自由空间,且 FSFI 值超过 30 的表空间中,很少会遇见有效自由空间的问题。当一个空间将要接近可比参数时,就需要做碎片整理了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值