帖子 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行。