广告
返回顶部
首页 > 资讯 > 数据库 >收缩表消除表中的空块
  • 266
分享到

收缩表消除表中的空块

2024-04-02 19:04:59 266人浏览 安东尼
摘要

收缩一张表时,oracle会以占用最小存储空间的方式来重新组织数据块。Delete操作通常不会降低高水位线,当做全表扫描时oracle会扫描高水位线下的块,一个表的数据可能不多但执行时间却很长,通常需要注意

收缩一张表时,oracle会以占用最小存储空间的方式来重新组织数据块。Delete操作通常不会降低高水位线,当做全表扫描时oracle会扫描高水位线下的块,一个表的数据可能不多但执行时间却很长,通常需要注意高水位下会有很多空闲的块存在。通常可通过对表进行shrink或move释放被占用的空间。

shrink表需要两步:1.启用行迁移;2.收缩表;

启用行迁移
sql> alter table t enable row movement;
收缩表
SQL> alter table t shrink space;
收缩表及相关的索引
SQL> alter table t shrink space cascade;
仅收缩表,不调高水位
SQL> alter table t shrink space compact;

move表需要两步:1.move表;2.重建相关索引
SQL> alter table t move tablespace users;
SQL> alter index idx_t on t(id) rebuild online tablespace idx_tbs;

可使用tom的show_space进行检查是否有空块存在:

create or replace procedure show_space(p_segname_1 in varchar2,
p_owner_1 in varchar2 default user,
p_type_1 in varchar2 default 'TABLE',
p_space in varchar2 default 'AUTO',
p_analyzed in varchar2 default 'Y') as
p_segname varchar2(100);
p_type varchar2(10);
p_owner varchar2(30);
l_unfORMatted_blocks number;
l_unformatted_bytes number;
l_fs1_blocks number;
l_fs1_bytes number;
l_fs2_blocks number;
l_fs2_bytes number;
l_fs3_blocks number;
l_fs3_bytes number;
l_fs4_blocks number;
l_fs4_bytes number;
l_full_blocks number;
l_full_bytes number;
l_free_blks number;
l_total_blocks number;
l_total_bytes number;
l_unused_blocks number;
l_unused_bytes number;
l_LastUsedExtFileId number;
l_LastUsedExtBlockId number;
l_LAST_USED_BLOCK number;
procedure p(p_label in varchar2, p_num in number) is
begin
dbms_output.put_line(rpad(p_label, 40, '.') || p_num);
end;
begin
p_segname := upper(p_segname_1); -- rainy changed
p_owner := upper(p_owner_1);
p_type := p_type_1;
if (p_type_1 = 'i' or p_type_1 = 'I') then
--rainy changed
p_type := 'INDEX';
end if;
if (p_type_1 = 't' or p_type_1 = 'T') then
--rainy changed
p_type := 'TABLE';
end if;
if (p_type_1 = 'c' or p_type_1 = 'C') then
--rainy changed
p_type := 'CLUSTER';
end if;
dbms_space.unused_space(segment_owner => p_owner,
segment_name => p_segname,
segment_type => p_type,
total_blocks => l_total_blocks,
total_bytes => l_total_bytes,
unused_blocks => l_unused_blocks,
unused_bytes => l_unused_bytes,
LAST_USED_EXTENT_FILE_ID => l_LastUsedExtFileId,
LAST_USED_EXTENT_BLOCK_ID => l_LastUsedExtBlockId,
LAST_USED_BLOCK => l_LAST_USED_BLOCK);
if p_space = 'MANUAL' or (p_space <> 'auto' and p_space <> 'AUTO') then
dbms_space.free_blocks(segment_owner => p_owner,
segment_name => p_segname,
segment_type => p_type,
freelist_group_id => 0,
free_blks => l_free_blks);
p('Free Blocks', l_free_blks);
end if;
p('Total Blocks', l_total_blocks);
p('Total Bytes', l_total_bytes);
p('Unused Blocks', l_unused_blocks);
p('Unused Bytes', l_unused_bytes);
p('Last Used Ext FileId', l_LastUsedExtFileId);
p('Last Used Ext BlockId', l_LastUsedExtBlockId);
p('Last Used Block', l_LAST_USED_BLOCK);
/IF the segment is analyzed /
if p_analyzed = 'Y' then
dbms_space.space_usage(segment_owner => p_owner,
segment_name => p_segname,
segment_type => p_type,
unformatted_blocks => l_unformatted_blocks,
unformatted_bytes => l_unformatted_bytes,
fs1_blocks => l_fs1_blocks,
fs1_bytes => l_fs1_bytes,
fs2_blocks => l_fs2_blocks,
fs2_bytes => l_fs2_bytes,
fs3_blocks => l_fs3_blocks,
fs3_bytes => l_fs3_bytes,
fs4_blocks => l_fs4_blocks,
fs4_bytes => l_fs4_bytes,
full_blocks => l_full_blocks,
full_bytes => l_full_bytes);
dbms_output.put_line(rpad(' ', 50, '*'));
dbms_output.put_line('The segment is analyzed');
p('0% -- 25% free space blocks', l_fs1_blocks);
p('0% -- 25% free space bytes', l_fs1_bytes);
p('25% -- 50% free space blocks', l_fs2_blocks);
p('25% -- 50% free space bytes', l_fs2_bytes);
p('50% -- 75% free space blocks', l_fs3_blocks);
p('50% -- 75% free space bytes', l_fs3_bytes);
p('75% -- 100% free space blocks', l_fs4_blocks);
p('75% -- 100% free space bytes', l_fs4_bytes);
p('Unused Blocks', l_unformatted_blocks);
p('Unused Bytes', l_unformatted_bytes);
p('Total Blocks', l_full_blocks);
p('Total bytes', l_full_bytes);
end if;
end;
/

用法参考:
https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTioN_ID:5350053031470

您可能感兴趣的文档:

--结束END--

本文标题: 收缩表消除表中的空块

本文链接: https://www.lsjlt.com/news/45204.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 收缩表消除表中的空块
    收缩一张表时,Oracle会以占用最小存储空间的方式来重新组织数据块。Delete操作通常不会降低高水位线,当做全表扫描时oracle会扫描高水位线下的块,一个表的数据可能不多但执行时间却很长,通常需要注意...
    99+
    2022-10-18
  • 表空间问题----收缩空间方法:表空间中表的查法:扩展表空间
    收缩空间方法:一.不删除数据,收缩表空间的数据文件大小,释放磁盘空间查询对应表所在的表空间select OWNER,SEGMENT_NAME,TABLESPACE_NAME,BYTES/1024/...
    99+
    2022-10-18
  • css如何消除表格间的空格
    这篇文章主要介绍“css如何消除表格间的空格”,在日常操作中,相信很多人在css如何消除表格间的空格问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”css如何消除表格间的空格”...
    99+
    2022-10-19
  • 消除临时表空间暴涨的方法
      关于消除temp ts暴涨的方法     经常有人问temp表空间暴涨的问题,以及如何回收临时表空间,由于版本的不同,方法显然也多种多样,但这些方法显示是治标...
    99+
    2022-10-18
  • mysql共享表空间的扩容、收缩和迁移
    本篇内容介绍了“mysql共享表空间的扩容、收缩和迁移”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
    99+
    2022-10-18
  • mysql收缩共享表空间的方法是什么
    这篇文章主要讲解了“mysql收缩共享表空间的方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“mysql收缩共享表空间的方法是什么”吧! ...
    99+
    2022-10-19
  • Oracle表空间数据库文件收缩的示例分析
    这篇文章主要介绍了Oracle表空间数据库文件收缩的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。我们经常会遇到数据库磁盘空间爆满的...
    99+
    2022-10-18
  • 数据库中如何收缩临时表空间及处理ORA-03297错误
    这篇文章主要为大家展示了“数据库中如何收缩临时表空间及处理ORA-03297错误”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“数据库中如何收缩临时表空间及处理O...
    99+
    2022-10-18
  • python去除列表中的空值元素实战技巧
    目录python去除列表中的空值元素实战技巧产生需求的原因:需求目标:具体实操:去除列表中的空值元素补充:python list清理列表中的空元素或特定元素python去除列表中的空...
    99+
    2023-02-02
    python去除列表空值元素 python删除列表空值
  • 我们如何使用 MySQL TRIM() 删除所有行中的空格并更新表?
    假设如果一个表中有许多值在表的列中包含空格,那么这是浪费空间。我们可以使用 TRIM() 函数从所有行中删除空格并在单个查询中更新表。按照“Employee”的示例,所有行中都有空格将展示这一概念 -示例mysql> Sele...
    99+
    2023-10-22
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作