问题描述
嗨,汤姆,
我有一个表空间和许多数据文件的数据库,而表分布在许多数据文件中。我使用下面的查询来检查碎片表列表。
选择所有者,表名称,块,数量 _ 行,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.如果表分散在许多数据文件中,减少碎片的标准方法是什么?或者我得到错误的碎片空间值由于表分散在许多数据文件?
我有一个表空间和许多数据文件的数据库,而表分布在许多数据文件中。我使用下面的查询来检查碎片表列表。
选择所有者,表名称,块,数量 _ 行,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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。