wjlcn 发表于 2011-12-22 08:54

如何降低Oracle表的高水位?

<a href="http://www.idb-stock.net/idb/2011/05/16/107.html" rel="bookmark" title="Permanent Link to 如何降低Oracle表的高水位?" target="_blank">如何降低Oracle表的高水位?</a><br><p>什么是oracle高水位:oracle表的高水位可以理解为表的数据量曾经到达某个点,由于后来数据的删除,现实的数据并没有达到这个点,并且有可能远远低于这个点。<br>
oracle高水位的英文就是:High Water Mark.<br>
产生高水位的原因有二:一是表有大量的delete操作,最常见的就是oracle物化视图日志;另一种就是用了insert /*+append*/。注意:insert/*+append*/回滚时,高水位是不会回滚的。</p>
<p>降低表的高水位,oracle提供了几种常见的方法:<br>
1.对表进行MOVE,做完MOVE后需要对表的所有过引进行重建(注意MOVE时需要双倍的表空间)。<br>
参考脚本:</p>
<div class="dp-highlighter"><div class="bar"><div class="tools"><a href="http://www.idb-stock.net/idb/2011/05/16/107.html#" target="_blank">view plain</a><a href="http://www.idb-stock.net/idb/2011/05/16/107.html#" target="_blank">copy to clipboard</a><a href="http://www.idb-stock.net/idb/2011/05/16/107.html#" target="_blank">print</a><a href="http://www.idb-stock.net/idb/2011/05/16/107.html#" target="_blank">?</a></div></div><ol class="dp-sql" start="1"><li class="alt"><span><span class="keyword">alter</span><span>&nbsp;</span><span class="keyword">table</span><span>&nbsp;table_name&nbsp;</span><span class="keyword">move</span><span>&nbsp;tablespace&nbsp;tbs_name;&nbsp;&nbsp;</span></span></li><li class=""><span><span class="keyword">select</span><span>&nbsp;</span><span class="string">'alter&nbsp;index&nbsp;'</span><span>||index_name||</span><span class="string">'&nbsp;rebuild;'</span><span>&nbsp;sql_text&nbsp;&nbsp;</span></span></li><li class="alt"><span><span class="keyword">from</span><span>&nbsp;user_index&nbsp;ui&nbsp;&nbsp;</span></span></li><li class=""><span><span class="keyword">where</span><span>&nbsp;ui.table_name=</span><span class="string">'&amp;tab_name'</span><span>;&nbsp;&nbsp;</span></span></li></ol></div>alter table table_name move tablespace tbs_name;
select 'alter index '||index_name||' rebuild;' sql_text
from user_index ui
where ui.table_name='&amp;tab_name';

<p>2.以ctas创建备份表,将源表truncate,然后回写:</p>
<div class="dp-highlighter"><div class="bar"><div class="tools"><a href="http://www.idb-stock.net/idb/2011/05/16/107.html#" target="_blank">view plain</a><a href="http://www.idb-stock.net/idb/2011/05/16/107.html#" target="_blank">copy to clipboard</a><a href="http://www.idb-stock.net/idb/2011/05/16/107.html#" target="_blank">print</a><a href="http://www.idb-stock.net/idb/2011/05/16/107.html#" target="_blank">?</a></div></div><ol class="dp-sql" start="1"><li class="alt"><span><span class="keyword">create</span><span>&nbsp;</span><span class="keyword">table</span><span>&nbsp;bak_table_name&nbsp;</span><span class="keyword">as</span><span>&nbsp;</span><span class="keyword">select</span><span>&nbsp;*&nbsp;</span><span class="keyword">from</span><span>&nbsp;table_name;&nbsp;&nbsp;</span></span></li><li class=""><span><span class="keyword">truncate</span><span>&nbsp;</span><span class="keyword">table</span><span>&nbsp;table_name;&nbsp;&nbsp;</span></span></li><li class="alt"><span><span class="keyword">insert</span><span>&nbsp;</span><span class="keyword">into</span><span>&nbsp;table_name&nbsp;</span><span class="keyword">select</span><span>&nbsp;*&nbsp;</span><span class="keyword">from</span><span>&nbsp;bak_table_name;&nbsp;&nbsp;</span></span></li><li class=""><span><span class="keyword">commit</span><span>;&nbsp;&nbsp;</span></span></li></ol></div>create table bak_table_name as select * from table_name;
truncate table table_name;
insert into table_name select * from bak_table_name;
commit;

<p>3.方法1、2对于小表比较适合,如果对上G的表进行操作,可能就比较麻烦了。建议进行exp/imp操作。<br>
4.对于Oracle 10g可以采用alter table shrink space;</p>
<div class="dp-highlighter"><div class="bar"><div class="tools"><a href="http://www.idb-stock.net/idb/2011/05/16/107.html#" target="_blank">view plain</a><a href="http://www.idb-stock.net/idb/2011/05/16/107.html#" target="_blank">copy to clipboard</a><a href="http://www.idb-stock.net/idb/2011/05/16/107.html#" target="_blank">print</a><a href="http://www.idb-stock.net/idb/2011/05/16/107.html#" target="_blank">?</a></div></div><ol class="dp-sql" start="1"><li class="alt"><span><span class="keyword">alter</span><span>&nbsp;</span><span class="keyword">table</span><span>&nbsp;table_name&nbsp;enable&nbsp;row&nbsp;movement;&nbsp;&nbsp;</span></span></li><li class=""><span><span class="keyword">alter</span><span>&nbsp;</span><span class="keyword">table</span><span>&nbsp;table_name&nbsp;shring&nbsp;</span><span class="func">space</span><span>;&nbsp;&nbsp;</span></span></li></ol></div>alter table table_name enable row movement;
alter table table_name shring space;

<p>用alter table move降低高水位:</p>
dw@dw&gt;create table yy as<br>2select *<br>3from dba_tables dt;<br><br> dw@dw&gt;<br> dw@dw&gt;analyze TABLE yy compute statistics;<br><br>dw@dw&gt;<br>dw@dw&gt;<br>dw@dw&gt;select UE.BYTES,UE.BLOCKS<br>2from user_extents ue<br>3where ue.segment_name='YY';<br><br>   BYTES   BLOCKS<br>---------- ----------<br>   65536          8<br>   65536          8<br>   65536          8<br>   65536          8<br>   65536          8<br>   65536          8<br>   65536          8<br>   65536          8<br><br>dw@dw&gt;<br>dw@dw&gt;SELECT T.TABLE_NAME,T.BLOCKS FROM USER_TABLES T<br>2WHERE T.TABLE_NAME='YY';<br><br>TABLE_NAME                         BLOCKS<br>------------------------------ ----------<br>YY                                     60<br><br>dw@dw&gt;<br>dw@dw&gt;DELETE YY<br>2WHERE ROWNUM &lt;<br>3(SELECT COUNT(1)-10 FROM YY);<br><br>dw@dw&gt;analyze TABLE yy compute statistics;<br><br>dw@dw&gt;<br>dw@dw&gt;select UE.BYTES,UE.BLOCKS<br>2from user_extents ue<br>3where ue.segment_name='YY';<br><br>   BYTES   BLOCKS<br>---------- ----------<br>   65536          8<br>   65536          8<br>   65536          8<br>   65536          8<br>   65536          8<br>   65536          8<br>   65536          8<br>   65536          8<br><br>dw@dw&gt;<br>dw@dw&gt;SELECT T.TABLE_NAME,T.BLOCKS FROM USER_TABLES T<br>2WHERE T.TABLE_NAME='YY';<br><br>TABLE_NAME                         BLOCKS<br>------------------------------ ----------<br>YY                                     60<br><br>dw@dw&gt;<br>dw@dw&gt;ALTER TABLE YY MOVE;<br><br>dw@dw&gt;<br>dw@dw&gt;<br>dw@dw&gt;analyze TABLE yy compute statistics;<br><br>dw@dw&gt;<br>dw@dw&gt;<br>dw@dw&gt;select UE.BYTES,UE.BLOCKS<br>2from user_extents ue<br>3where ue.segment_name='YY';<br><br>   BYTES   BLOCKS<br>---------- ----------<br>   65536          8<br><br>dw@dw&gt;<br>dw@dw&gt;SELECT T.TABLE_NAME,T.BLOCKS FROM USER_TABLES T<br>2WHERE T.TABLE_NAME='YY';<br><br>TABLE_NAME                         BLOCKS<br>------------------------------ ----------<br>YY                                    4<br><br><br><strong>转载请注明:</strong>本文来自iDB Stock:<a href="http://www.idb-stock.net/idb/2011/05/16/107.html" target="_blank">http://www.idb-stock.net/idb/2011/05/16/107.html</a><br>
页: [1]
查看完整版本: 如何降低Oracle表的高水位?