查詢11G的資料字典試圖ALL_OBJECTS遇到BUG

kewin發表於2010-05-12

查詢11G的資料字典試圖遇到BUG
2010-5-4
在Oracle新版本上比較容易遇到BUG,最近還是真讓我偶遇到了。而且還是個將為生產環境的資料庫。汗啊。
在一個windows server 2008的11.1.0.6的環境上,查詢all_objects 試圖時,發現每次都會產生大量的遞迴呼叫,而且執行時間很長。

SQL>select count(*) from all_objects;

Elapsed: 00:00:08.99
Statistics
----------------------------------------------------------
     94579  recursive calls
         0  db block gets
    198754  consistent gets
      1657  physical reads
         0  redo size
       420  bytes sent via SQL*Net to client
       419  bytes received via SQL*Net from client
         2  SQL*Net roundtrips to/from client
      1063  sorts (memory)
         0  sorts (disk)
         1  rows processed

在10G和9I上都沒有同樣的問題。

On 9.2.0.8:

SQL> set timing on
SQL> set autotr on
SQL> select count(*) from all_objects;

  COUNT(*)
----------
     30368

Elapsed: 00:00:00.12

On 10.2.0.4:
SQL> select count(*) from all_objects;
  COUNT(*)
----------
     50538

Elapsed: 00:00:00.22

Statistics
----------------------------------------------------------
        680  recursive calls
          0  db block gets
      14130  consistent gets
         14  physical reads
          0  redo size
        517  bytes sent via SQL*Net to client
        487  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
         11  sorts (memory)
          0  sorts (disk)
          1  rows processed

在11G的recursive call比9i,10G高出很多,而且執行的時間要8秒多才執行完畢。
做了10046的trace,發現下面的兩個SQL總耗時為7.32秒。
select sys_nc_oid$ 
from
xdb.xdb$resource where rowid = :1


call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse    10633      2.29       2.48          0          0          0           0
Execute  10633      3.23       3.42          0        156          0           0
Fetch    10633      2.92       3.14          0      10633          0       10633
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total    31899      8.45       9.05          0      10789          0       10633

select value(p$)
from
"XDB"."XDB$RESOURCE"                 as of snapshot(:2) p$ where SYS_NC_OID$
 = :1


call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        0      0.00       0.00          0          0          0           0
Execute  10633      3.76       3.90          0          0          0           0
Fetch    10633      1.17       1.53          0      31899          0       10633
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total    21266      4.93       5.44          0      31899          0       10633


深入問題去分析,結果是該版本上的一個Bug 7295298,而且在11.1.0.6的windows版本上沒有相關的獨立補丁可打。升級到11.1.0.7可解決這個問題。
有個規避的方式就是設定EVENTS:
alter session set events '10158 trace name context forever';
我是沒有去設定,因為只有DBA才會查詢這個試圖。
不要Oracle新資料庫引擎的第一版來作為生產環境,還真是百驗不爽的真理。
這個ALL_OBJECTS的試圖,還好沒有什麼使用者使用,對環境影響不大。在下次有機會升級時,一併把這個BUG解決了。
-THE END-

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/40239/viewspace-662499/,如需轉載,請註明出處,否則將追究法律責任。

相關文章