暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 即使缩小空间后也无法恢复空间

askTom 2017-07-20
353

问题描述

嗨,汤姆,
我有一个表空间和许多数据文件的数据库,而表分布在许多数据文件中。我使用下面的查询来检查碎片表列表。

选择所有者,表名称,块,数量 _ 行,avg_row_len,圆形 (块 * 8/1024)),2) “TOTAL_SIZE_MB”,圆形 ((数量 _ 行 * avg_row_len
/1024/1024),2) “实际 _ 大小 _ mb”,圆形 (块 * 8/1024)-(数 _ 行 * avg_row_len/1024/1024)),2) “碎片 _ 空间 _ mb”
dba_tables,其中所有者在 ('xxxx') 和圆形 (块 * 8/1024)-(数量 _ 行 * avg_row_len/1024/1024)),2)
> 8 desc 1024订单;

我拿了一个表并使用下面的查询来减少碎片的帖子

alter table xxx启用行移动;
改变表xxx收缩空间;
alter table xxx禁用行移动;

我验证了结果,如果碎片减少或不使用下面的查询,但差异不大

查询1:
选择所有者,表名称,块,数量 _ 行,avg_row_len,圆形 (块 * 8/1024)),2) “TOTAL_SIZE_MB”,圆形 ((数量 _ 行 * avg_row_len
/1024/1024),2) “实际 _ 大小 _ mb”,圆形 (块 * 8/1024)-(数 _ 行 * avg_row_len/1024/1024)),2) “碎片 _ 空间 _ mb”
dba_tables,其中所有者在 ('xxxx') 和圆形 (块 * 8/1024)-(数量 _ 行 * avg_row_len/1024/1024)),2)
> 8 desc 1024订单;

查询2:
从user_segments中选择segment_name,字节/1024/1024为mb,其中segment_name = 'XXX';

问题:
1.我的理解是上述查询显示的碎片空间,并且必须将segment advisor (可回收空间) 减小到大约0,但这没有发生。是因为表分散在多个数据文件中吗?为什么它显示我错误的边缘尺寸?
2.如果表分散在许多数据文件中,减少碎片的标准方法是什么?或者我得到错误的碎片空间值由于表分散在许多数据文件?



专家解答

您的第一个查询中的数字只有在重新收集统计信息后才会更新 (请参阅最后的演示),因此您需要这样做

但是我的第一个问题是-您希望实现什么?

如果有人对我说-我的表在很多程度上散布在许多数据文件中,我的回答通常是: “我不在乎”。

您可能需要执行 “收缩空间” 命令的特定原因,例如

-提高全表扫描的总体资源成本
-为永远不会再增长的表回收空间

但是改进表在文件中的分布方式很少是其中之一。

SQL> create table t pctfree 0 as select d.* from dba_objects d,
  2  ( select 1 from dual connect by level <= 10 );

Table created.

SQL>
SQL> exec dbms_stats.gather_table_stats('','T');

PL/SQL procedure successfully completed.

SQL>
SQL> select
  2  blocks,num_rows,avg_row_len,round(((blocks*8/1024)),2) "TOTAL_SIZE_MB",
  3  round((num_rows*avg_row_len/1024/1024),2) "ACTUAL_SIZE_MB",
  4  round(((blocks*8/1024)-(num_rows*avg_row_len/1024/1024)),2) "FRAGMENTED_SPACE_MB"
  5  from dba_tables
  6  where owner = user
  7  and table_name = 'T';

    BLOCKS   NUM_ROWS AVG_ROW_LEN TOTAL_SIZE_MB ACTUAL_SIZE_MB FRAGMENTED_SPACE_MB
---------- ---------- ----------- ------------- -------------- -------------------
     13769     780490         132        107.57          98.25                9.32

1 row selected.

SQL>
SQL> delete from t where mod(object_id,2) = 0 ;

389690 rows deleted.

SQL> commit;

Commit complete.

SQL>
SQL> select
  2  blocks,num_rows,avg_row_len,round(((blocks*8/1024)),2) "TOTAL_SIZE_MB",
  3  round((num_rows*avg_row_len/1024/1024),2) "ACTUAL_SIZE_MB",
  4  round(((blocks*8/1024)-(num_rows*avg_row_len/1024/1024)),2) "FRAGMENTED_SPACE_MB"
  5  from dba_tables
  6  where owner = user
  7  and table_name = 'T';

    BLOCKS   NUM_ROWS AVG_ROW_LEN TOTAL_SIZE_MB ACTUAL_SIZE_MB FRAGMENTED_SPACE_MB
---------- ---------- ----------- ------------- -------------- -------------------
     13769     780490         132        107.57          98.25                9.32

1 row selected.

SQL>
SQL> alter table t enable row movement;

Table altered.

SQL> alter table t shrink space;

Table altered.

SQL>
SQL> select
  2  blocks,num_rows,avg_row_len,round(((blocks*8/1024)),2) "TOTAL_SIZE_MB",
  3  round((num_rows*avg_row_len/1024/1024),2) "ACTUAL_SIZE_MB",
  4  round(((blocks*8/1024)-(num_rows*avg_row_len/1024/1024)),2) "FRAGMENTED_SPACE_MB"
  5  from dba_tables
  6  where owner = user
  7  and table_name = 'T';

    BLOCKS   NUM_ROWS AVG_ROW_LEN TOTAL_SIZE_MB ACTUAL_SIZE_MB FRAGMENTED_SPACE_MB
---------- ---------- ----------- ------------- -------------- -------------------
     13769     780490         132        107.57          98.25                9.32

1 row selected.

SQL>
SQL>
SQL> exec dbms_stats.gather_table_stats('','T');

PL/SQL procedure successfully completed.

SQL>
SQL> select
  2  blocks,num_rows,avg_row_len,round(((blocks*8/1024)),2) "TOTAL_SIZE_MB",
  3  round((num_rows*avg_row_len/1024/1024),2) "ACTUAL_SIZE_MB",
  4  round(((blocks*8/1024)-(num_rows*avg_row_len/1024/1024)),2) "FRAGMENTED_SPACE_MB"
  5  from dba_tables
  6  where owner = user
  7  and table_name = 'T';

    BLOCKS   NUM_ROWS AVG_ROW_LEN TOTAL_SIZE_MB ACTUAL_SIZE_MB FRAGMENTED_SPACE_MB
---------- ---------- ----------- ------------- -------------- -------------------
      6813     390800         132         53.23           49.2                4.03

1 row selected.

复制


「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论