設定CURRENT_SCHEMA後獲取執行計劃報錯

yangtingkun發表於2010-09-09

當設定了CURRENT_SCHEMA後,利用EXPLAIN PLAN語句分析執行計劃,在獲取執行計劃時出現錯誤。

 

 

例子如下:

SQL> conn / as sysdba
已連線。
SQL> alter session set current_schema = test;

會話已更改。

SQL> explain plan for select * from t;

已解釋。

SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Error: cannot fetch last explain plan from PLAN_TABLE

造成這個問題的原因很簡單,雖然設定了CURRENT_SCHEMA使得SELECT * FROM T這個語句在TEST方案下執行,但是EXPLAIN PLAN在寫PLAN_TABLE的時候並沒有寫到對應SCHEMA下,而是寫入當前使用者的PLAN_TABLE表:

SQL> select count(*) from plan_table;

  COUNT(*)
----------
         0

SQL> alter session set current_schema = sys;

會話已更改。

SQL> select count(*) from plan_table;

  COUNT(*)
----------
         2


SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------
Plan hash value: 1601196873

--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |     1 |    30 |     2   (0)| 00:00:01 |
|   1 |  TABLE ACCESS FULL| T    |     1 |    30 |     2   (0)| 00:00:01 |
--------------------------------------------------------------------------

Note
-----
   - dynamic sampling used for this statement (level=2)

已選擇12行。

如果當前使用者和設定的目標使用者使用的是同一個PLAN_TABLE,則不會存在這個問題:

SQL> alter session set current_schema = test;

會話已更改。

SQL> drop table plan_table;

表已刪除。

SQL> explain plan for select * from t;

已解釋。

SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------
Plan hash value: 1601196873

--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |     1 |    30 |     2   (0)| 00:00:01 |
|   1 |  TABLE ACCESS FULL| T    |     1 |    30 |     2   (0)| 00:00:01 |
--------------------------------------------------------------------------

Note
-----
   - dynamic sampling used for this statement (level=2)

已選擇12行。

EXPLAIN PLAN沒有支援CURRENT_SCHEMA,這個問題在11.2中仍然存在。

 

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

相關文章