天天看点

Segment in recyclebin? Is it free?

考过10g ocp的朋友大概都看到过这样的问题,回收站中的对象所占空间是否算作free space? 纸上得来终觉浅,我们实地考察一下:

<a href="http://blog.51cto.com/maclean/1277531#">?</a>

<code>SQL&gt; </code><code>set</code> <code>long 99999999;</code>

<code>/*DBA_FREE_SPACE视图列出了数据库中所有表空间上空闲的区间,利用该视图我们可以计算表空间使用率等</code>

<code>注意该视图不会列出本地管理模式中offline的数据文件(或表空间)上的相关区间信息*/</code>

<code>SQL&gt; </code><code>select</code> <code>text </code><code>from</code> <code>dba_views </code><code>where</code> <code>view_name=</code><code>'DBA_FREE_SPACE'</code><code>;</code>

<code>TEXT</code>

<code>--------------------------------------------------------------------------------</code>

<code>select</code> <code>ts.</code><code>name</code><code>, fi.file#, f.block#,</code>

<code>       </code><code>f.length * ts.blocksize, f.length, f.file#</code>

<code>from</code> <code>sys.ts$ ts, sys.fet$ f, sys.file$ fi</code>

<code>where</code> <code>ts.ts# = f.ts#</code>

<code>  </code><code>and</code> <code>f.ts# = fi.ts#</code>

<code>  </code><code>and</code> <code>f.file# = fi.relfile#</code>

<code>  </code><code>and</code> <code>ts.bitmapped = 0</code>

<code>union</code> <code>all</code>

<code>select</code> <code>/*+ ordered use_nl(f) use_nl(fi) */</code>

<code>       </code><code>ts.</code><code>name</code><code>, fi.file#, f.ktfbfebno,</code>

<code>       </code><code>f.ktfbfeblks * ts.blocksize, f.ktfbfeblks, f.ktfbfefno</code>

<code>from</code> <code>sys.ts$ ts, sys.x$ktfbfe f, sys.file$ fi</code>

<code>where</code> <code>ts.ts# = f.ktfbfetsn</code>

<code>  </code><code>and</code> <code>f.ktfbfetsn = fi.ts#</code>

<code>  </code><code>and</code> <code>f.ktfbfefno = fi.relfile#</code>

<code>  </code><code>and</code> <code>ts.bitmapped &lt;&gt; 0 </code><code>and</code> <code>ts.online$ </code><code>in</code> <code>(1,4) </code><code>and</code> <code>ts.contents$ = 0</code>

<code>select</code> <code>/*+ ordered use_nl(u) use_nl(fi) */</code>

<code>       </code><code>ts.</code><code>name</code><code>, fi.file#, u.ktfbuebno,</code>

<code>       </code><code>u.ktfbueblks * ts.blocksize, u.ktfbueblks, u.ktfbuefno</code>

<code>from</code> <code>sys.recyclebin$ rb, sys.ts$ ts, sys.x$ktfbue u, sys.file$ fi</code>

<code>where</code> <code>ts.ts# = rb.ts#</code>

<code>  </code><code>and</code> <code>rb.ts# = fi.ts#</code>

<code>  </code><code>and</code> <code>u.ktfbuefno = fi.relfile#</code>

<code>  </code><code>and</code> <code>u.ktfbuesegtsn = rb.ts#</code>

<code>  </code><code>and</code> <code>u.ktfbuesegfno = rb.file#</code>

<code>  </code><code>and</code> <code>u.ktfbuesegbno = rb.block#</code>

<code>select</code> <code>ts.</code><code>name</code><code>, fi.file#, u.block#,</code>

<code>       </code><code>u.length * ts.blocksize, u.length, u.file#</code>

<code>from</code> <code>sys.ts$ ts, sys.uet$ u, sys.file$ fi, sys.recyclebin$ rb</code>

<code>where</code> <code>ts.ts# = u.ts#</code>

<code>  </code><code>and</code> <code>u.ts# = fi.ts#</code>

<code>  </code><code>and</code> <code>u.segfile# = fi.relfile#</code>

<code>  </code><code>and</code> <code>u.ts# = rb.ts#</code>

<code>  </code><code>and</code> <code>u.segfile# = rb.file#</code>

<code>  </code><code>and</code> <code>u.segblock# = rb.block#</code>

<code>/*可以看到后2个子查询链接中存在recyclebin$基表*/</code>

<code>SQL&gt; show </code><code>user</code><code>;</code>

<code>User</code> <code>is</code> <code>"system"</code>

<code>SQL&gt; purge recyclebin;</code>

<code>Done</code>

<code>SQL&gt; </code><code>create</code> <code>table</code> <code>YOUYUS tablespace users </code><code>as</code> <code>select</code> <code>* </code><code>from</code> <code>dba_objects;</code>

<code>Table</code> <code>created</code>

<code>SQL&gt; </code><code>select</code> <code>sum</code><code>(bytes) </code><code>from</code> <code>dba_free_space </code><code>where</code> <code>tablespace_name=</code><code>'USERS'</code><code>;</code>

<code>SUM</code><code>(BYTES)</code>

<code>----------</code>

<code>    </code><code>851968</code>

<code>SQL&gt; </code><code>drop</code> <code>table</code> <code>YOUYUS;</code>

<code>Table</code> <code>dropped</code>

<code>SQL&gt; col ORIGINAL_NAME   </code><code>for</code> <code>a10;</code>

<code>SQL&gt; col ts_name </code><code>for</code> <code>a10;</code>

<code>SQL&gt; </code><code>select</code> <code>original_name,operation,type,ts_name,</code><code>space</code> <code>from</code> <code>dba_recyclebin;</code>

<code>ORIGINAL_N OPERATION TYPE                      TS_NAME         </code><code>SPACE</code>

<code>---------- --------- ------------------------- ---------- ----------</code>

<code>YOUYUS     </code><code>DROP</code>      <code>TABLE</code>                     <code>USERS            1152</code>

<code>/* 这里的</code><code>SPACE</code><code>单位是standard block </code><code>size</code><code>,1152 * 8k=9216k */</code>

<code>SQL&gt; </code><code>select</code> <code>sum</code><code>(bytes)  </code><code>from</code> <code>dba_free_space </code><code>where</code> <code>tablespace_name=</code><code>'USERS'</code><code>;</code>

<code>  </code><code>10289152</code>

<code>/* 可以看到YOUYUS表被回收后,USERS表空间上的</code><code>FREE</code> <code>EXTENT空间也随之增长了;10289152-851968=9216k 与YOUYUS表的大小吻合*/</code>

<code>col </code><code>name</code> <code>for</code> <code>a10;</code>

<code>/*通过以下查询可以发现数据库中本地管理模式表空间上已被回收对象可以被覆盖重用的区间信息*/</code>

<code>  </code><code>and</code> <code>ts.bitmapped &lt;&gt; 0 </code><code>and</code> <code>ts.online$ </code><code>in</code> <code>(1,4) </code><code>and</code> <code>ts.contents$ = 0;</code>

<code>NAME</code>            <code>FILE#  KTFBUEBNO U.KTFBUEBLKS*TS.BLOCKSIZE KTFBUEBLKS  KTFBUEFNO</code>

<code>---------- ---------- ---------- ------------------------- ---------- ----------</code>

<code>USERS               4        184                     65536          8          4</code>

<code>USERS               4        192                     65536          8          4</code>

<code>USERS               4        200                     65536          8          4</code>

<code>USERS               4        208                     65536          8          4</code>

<code>USERS               4        216                     65536          8          4</code>

<code>USERS               4        224                     65536          8          4</code>

<code>USERS               4        232                     65536          8          4</code>

<code>So We can reuse segment </code><code>space</code> <code>which resided </code><code>in</code> <code>recyclebin!</code>

<code>That' great!</code>

本文转自maclean_007 51CTO博客,原文链接:http://blog.51cto.com/maclean/1277531