考过10g ocp的朋友大概都看到过这样的问题,回收站中的对象所占空间是否算作free space? 纸上得来终觉浅,我们实地考察一下:
<a href="http://blog.51cto.com/maclean/1277531#">?</a>
<code>SQL> </code><code>set</code> <code>long 99999999;</code>
<code>/*DBA_FREE_SPACE视图列出了数据库中所有表空间上空闲的区间,利用该视图我们可以计算表空间使用率等</code>
<code>注意该视图不会列出本地管理模式中offline的数据文件(或表空间)上的相关区间信息*/</code>
<code>SQL> </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 <> 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> show </code><code>user</code><code>;</code>
<code>User</code> <code>is</code> <code>"system"</code>
<code>SQL> purge recyclebin;</code>
<code>Done</code>
<code>SQL> </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> </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> </code><code>drop</code> <code>table</code> <code>YOUYUS;</code>
<code>Table</code> <code>dropped</code>
<code>SQL> col ORIGINAL_NAME </code><code>for</code> <code>a10;</code>
<code>SQL> col ts_name </code><code>for</code> <code>a10;</code>
<code>SQL> </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> </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 <> 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