帖子 http://bbs.landingbj.com/t-0-253150-1.html 总结了Oracle 展示执行计划的几种方法;
我在测试普通用户使用 DISPLAY_CURSOR 展示执行计划的时候遇到了权限不足的问题,记录如下:
问题现象
SQL> show user;
USER 为 "TEST"
SQL> create table b(x int);
表已创建。
SQL> SELECT * FROM table(DBMS_XPLAN.DISPLAY_CURSOR);
PLAN_TABLE_OUTPUT
------------------------------------------------------------------------
User has no SELECT privilege on V$SESSION--此处报错没有 v$session 的select 权限
解决办法
经查,需要对执行DISPLAY_CURSOR的用户分配访问v$sql_plan,v$session,v$sql_plan_statistics_all,v$sql 权限。
SQL> conn / as sysdba
已连接。
SQL> grant select on v_$sql_plan to test;
授权成功。
SQL> grant select on v_$session to test;
授权成功。
SQL>  grant select on v_$sql_plan_statistics_all to  test;
授权成功。
SQL> grant select on v_$sql to test;
授权成功。
SQL> conn test/oracle
已连接。
权限分配后问题解决,顺利展示执行计划:
SQL> SELECT * FROM table(DBMS_XPLAN.DISPLAY_CURSOR);
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------
SQL_ID  dyk4dprp70d74, child number 0
-------------------------------------
SELECT DECODE('A','A','1','2') FROM DUAL
Plan hash value: 1388734953
-----------------------------------------------------------------
Id   Operation         Name Rows   Cost (%CPU) Time
-----------------------------------------------------------------
0 SELECT STATEMENT                 2 (100)
1  FAST DUAL                 1     2   (0) 00:00:01
PLAN_TABLE_OUTPUT
-----------------------------------------------------------------
已选择13行。
SQL> SELECT sql_id, child_number FROM v$sql WHERE sql_text LIKE '%wanglei%';
SQL_ID        CHILD_NUMBER
------------- ------------
6zs46x605af3z            0
2k9dqafdc7s8n            0
SQL> SELECT * FROM table(DBMS_XPLAN.DISPLAY_CURSOR('2k9dqafdc7s8n',0));
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------
SQL_ID  2k9dqafdc7s8n, child number 0
-------------------------------------
select * from b
Plan hash value: 1911541843
--------------------------------------------------------------------------
Id   Operation         Name Rows   Bytes Cost (%CPU) Time
--------------------------------------------------------------------------
0 SELECT STATEMENT                         2 (100)
1  TABLE ACCESS FULL B         1    13     2   (0) 00:00:01
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------
Note
-----
- dynamic sampling used for this statement (level=2)
已选择17行。