如何降低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> </span><span class="keyword">table</span><span> table_name </span><span class="keyword">move</span><span> tablespace tbs_name; </span></span></li><li class=""><span><span class="keyword">select</span><span> </span><span class="string">'alter index '</span><span>||index_name||</span><span class="string">' rebuild;'</span><span> sql_text </span></span></li><li class="alt"><span><span class="keyword">from</span><span> user_index ui </span></span></li><li class=""><span><span class="keyword">where</span><span> ui.table_name=</span><span class="string">'&tab_name'</span><span>; </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='&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> </span><span class="keyword">table</span><span> bak_table_name </span><span class="keyword">as</span><span> </span><span class="keyword">select</span><span> * </span><span class="keyword">from</span><span> table_name; </span></span></li><li class=""><span><span class="keyword">truncate</span><span> </span><span class="keyword">table</span><span> table_name; </span></span></li><li class="alt"><span><span class="keyword">insert</span><span> </span><span class="keyword">into</span><span> table_name </span><span class="keyword">select</span><span> * </span><span class="keyword">from</span><span> bak_table_name; </span></span></li><li class=""><span><span class="keyword">commit</span><span>; </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> </span><span class="keyword">table</span><span> table_name enable row movement; </span></span></li><li class=""><span><span class="keyword">alter</span><span> </span><span class="keyword">table</span><span> table_name shring </span><span class="func">space</span><span>; </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>create table yy as<br>2select *<br>3from dba_tables dt;<br><br> dw@dw><br> dw@dw>analyze TABLE yy compute statistics;<br><br>dw@dw><br>dw@dw><br>dw@dw>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><br>dw@dw>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><br>dw@dw>DELETE YY<br>2WHERE ROWNUM <<br>3(SELECT COUNT(1)-10 FROM YY);<br><br>dw@dw>analyze TABLE yy compute statistics;<br><br>dw@dw><br>dw@dw>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><br>dw@dw>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><br>dw@dw>ALTER TABLE YY MOVE;<br><br>dw@dw><br>dw@dw><br>dw@dw>analyze TABLE yy compute statistics;<br><br>dw@dw><br>dw@dw><br>dw@dw>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><br>dw@dw>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]