大家好!
    今天我在查看数据库表空间状态时使用了如下语句:
    select f.tablespace_name,a.total,u.used,f.free,round((u.used/a.total)*100) "% used",   
      round((f.free/a.total)*100) "% Free"    
      from   
      (select tablespace_name, sum(bytes/(1024*1024)) total    
           from dba_data_files group by tablespace_name) a,   
      (select tablespace_name, round(sum(bytes/(1024*1024))) used    
           from dba_extents group by tablespace_name) u,   
      (select tablespace_name, round(sum(bytes/(1024*1024))) free    
           from dba_free_space group by tablespace_name) f   
    WHERE a.tablespace_name = f.tablespace_name   
    and a.tablespace_name = u.tablespace_name这个语句是没有问题的,之前一直在用,大约1分钟左右就可以查询出结果,但是今天运行了20多分钟,也没查出来。请问各位如果遇到这种情况,如何一步步分析原因?PS:数据库锁表情况已查看,状态正常。

解决方案 »

  1.   

    1、把3个子查询分别执行一下。
    2、重点关注dba_extents这个表,查看一下这个子查询的执行计划。
      

  2.   

    ---你的語法有點慢  試試下面這個select a.tablespace_name,
           a.total_mbytes,
           a.total_mbytes - nvl(b.free_mbytes, 0) used_mbytes,
           nvl(b.free_mbytes, 0) free_mbytes,
           trunc(nvl(b.free_mbytes, 0) / a.total_mbytes * 100, 2) pct_free
      from (select tablespace_name, sum(bytes) / 1024 / 1024 total_mbytes
              from dba_data_files
             group by tablespace_name) a,
           (select tablespace_name, sum(bytes) / 1024 / 1024 free_mbytes
              from dba_free_space
             group by tablespace_name) b
     where a.tablespace_name = b.tablespace_name(+)
     order by 5 asc