微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我如何知道Oracle中的表是否碎片化?

如何解决我如何知道Oracle中的表是否碎片化?

| 我有一张桌子似乎占用了过多的空间。建议我将数据复制到新表,然后重命名新表和旧表以交换它们。如何确认当前表是否实际为碎片?如何估算或计算包含相同数据的新表的新大小?     

解决方法

        如果您的统计信息是最新的,那么如果表中的块多于行数据的数量,这应该可以很好地表明。
select table_name,round((num_rows * avg_row_len) /(8*1024)),blocks 
from user_tables where ....
该空间将用于将来的插入,因此不一定是问题。如果您已完成大型数据存档或删除,则可能值得回收空间(特别是如果您进行大量全表扫描)。 [注意:我假设是8k块,这是默认值。] 如果执行CREATE / DROP / RENAME,则会丢失所有索引,约束,授权(如果使用它们,还会加上表注释)。 最好检查当前表空间(在USER_SEGMENTS中查看)并执行
ALTER TABLE tablename MOVE current_tablespace;
您也将需要在后端重建索引。从USER_INDEXES挑选它们,然后做
ALTER INDEX ... REBUILD;
    ,        -尝试使用以DBA连接的svrmgrl运行此脚本
set serveroutput on

DECLARE
   libcac   NUMBER (6,2);
   rowcac   NUMBER (6,2);
   bufcac   NUMBER (6,2);
   redlog   NUMBER (6,2);
   spsize   NUMBER;
   blkbuf   NUMBER;
   logbuf   NUMBER;
BEGIN
   SELECT VALUE
     INTO redlog
     FROM v$sysstat
    WHERE name = \'redo log space requests\';

   SELECT 100 * (SUM (pins) - SUM (reloads)) / SUM (pins)
     INTO libcac
     FROM v$librarycache;

   SELECT 100 * (SUM (gets) - SUM (getmisses)) / SUM (gets)
     INTO rowcac
     FROM v$rowcache;

   SELECT 100 * (cur.VALUE con.VALUE - phys.VALUE)/(cur.VALUE con.VALUE)
into bufcac
from v$sysstat cur,v$sysstat con,v$sysstat phys,v$statname ncu,v$statname nco,v$statname nph
where cur.statistic# = ncu.statistic# and
ncu.name = \'db block gets\' and
con.statistic# = nco.statistic# and
nco.name = \'consistent gets\' and
phys.statistic# = nph.statistic# and
nph.name = \'physical reads\';

select VALUE
into spsize
from v$parameter
where name = \'shared_pool_size\';

select VALUE
into blkbuf
from v$parameter
where name = \'db_block_buffers\';

select VALUE
into logbuf
from v$parameter
where name = \'log_buffer\';

DBMS_OUTPUT.put_line(\'> SGA CACHE STATISTICS\');
DBMS_OUTPUT.put_line(\'> ********************\');
DBMS_OUTPUT.put_line(\'> SQL Cache Hit rate = \'||libcac);
DBMS_OUTPUT.put_line(\'> Dict Cache Hit rate = \'||rowcac);
DBMS_OUTPUT.put_line(\'> Buffer Cache Hit rate = \'||bufcac);
DBMS_OUTPUT.put_line(\'> Redo Log space requests = \'||redlog);
DBMS_OUTPUT.put_line(\'> \');
DBMS_OUTPUT.put_line(\'> INIT.ORA SETTING\');
DBMS_OUTPUT.put_line(\'> ****************\');
DBMS_OUTPUT.put_line(\'> Shared Pool Size = \'||spsize||\' Bytes\');
DBMS_OUTPUT.put_line(\'> DB Block Buffer = \'||blkbuf||\' Blocks\');
DBMS_OUTPUT.put_line(\'> Log Buffer = \'||logbuf||\' Bytes\');
DBMS_OUTPUT.put_line(\'> \');

if libcac < 99
then
DBMS_OUTPUT.put_line(\'*** HINT: Library Cache too low! Increase the Shared Pool Size.\');
end if;

if rowcac < 85
then
DBMS_OUTPUT.put_line(\'*** HINT: Row Cache too low! Increase the Shared Pool Size.\');
end if;

if bufcac < 90
then
DBMS_OUTPUT.put_line(\'*** HINT: Buffer Cache too low! Increase the DB Block Buffer value.\');
end if;

if redlog > 100
then
DBMS_OUTPUT.put_line(\'*** HINT: Log Buffer value is rather low!\');
end if;

end;
/
    ,        考虑使用
dbms_space.space_usage
dbms_space
包装中的其他步骤。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。