1.实验环境

SQL>show user

USER is "SYS"

SQL> set linesize 1000;

SQL> select version from v$instance;

VERSION

-----------------

11.2.0.1.0

--创建用户

SQL> create user tempuser identified by tempuser;

User created.

--授予必要的权限

SQL> grant resource to tempuser;

Grant succeeded.

SQL> grant connect to tempuser;

Grant succeeded.

2.tempuser用户调试执行计划

SQL> show user

USER is "TEMPUSER"

SQL> create table test(id int);

Table created.

SQL> select count(1) from test;

COUNT(1)

----------

0

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

PLAN_TABLE_OUTPUT

-----------------------------------------------------------

User has no SELECT privilege on V$SESSION

--这里我们看到提示需要对V$SESSIONselect权限

--赋权

SQL> grant select on v_$session to tempuser;

Grant succeeded.

--这里注意对象是 v_$session而不是我们经常使用的 v$session因为v$sessionv_$session的同义词

--再调试

SQL> select count(1) from test;

COUNT(1)

----------

0

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

PLAN_TABLE_OUTPUT

--------------------------------------------------------------------------------

User has no SELECT privilege on V$SQL_PLAN

--这里看到提示变了,继续赋权

SQL> grant select on v_$sql_plan to tempuser;

Grant succeeded.

SQL> select count(1) from test;

COUNT(1)

----------

0

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

PLAN_TABLE_OUTPUT

--------------------------------------------------------------------------------

User has no SELECT privilege on V$SQL_PLAN

--然而这里我们看到的提示没变,我们明明已经赋予权限了呀?

SQL> show user;

USER is "TEMPUSER"

SQL> select count(1) from v$sql_plan;

COUNT(1)

----------

4060

--我们看到权限已经赋予,但提示却还是一样,我百度了一些资料,得到答案,这里还需要v$sql的权限,至于为什么,我没有找到相关文档,也许可以这样理解,如果我们平常需要查询一句sql的执行计划,首先需要该sqlsql id,而这个sqlid 一般我们都是需要去v$sql 里去查询的,而oracle内部的算法,不外乎也是这种思路吧。

--继续赋权

SQL> grant select on v_$sql to tempuser;

Grant succeeded.

SQL> select count(1) from test;

COUNT(1)

----------

0

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

PLAN_TABLE_OUTPUT

--------------------------------------------------------------------------------

SQL_ID  7zrgxh35ctntg, childnumber 1

-------------------------------------

select count(1) from test

Plan hash value: 1950795681

-------------------------------------------------------------------

| Id  | Operation          | Name | Rows  | Cost (%CPU)| Time     |

-------------------------------------------------------------------

|   0 | SELECT STATEMENT   |     |       |     2 (100)|          |

|   1 |  SORT AGGREGATE    |     |     1 |            |          |

|   2 |   TABLE ACCESS FULL| TEST |     1 |    2   (0)| 00:00:01 |

-------------------------------------------------------------------

Note

-----

- dynamic sampling used forthis statement (level=2)

18 rows selected.

--ok,这边已经有执行计划了,继续详细信息

SQL> select * fromtable(dbms_xplan.display_cursor(null,null,'ADVANCED  ALLSTATS LAST PEEKED_BINDS'));

PLAN_TABLE_OUTPUT

--------------------------------------------------------------------------------

User has no SELECT privilege on V$SQL_PLAN_STATISTICS_ALL

--继续吧

SQL> grant select on v_$sql_plan_statistics_all to tempuser;

Grant succeeded.

--这里statistics_level =all让统计信息最为详尽

SQL> alter session set statistics_level =all;

Session altered.

SQL> select count(1) from test;

COUNT(1)

----------

0

SQL> select * fromtable(dbms_xplan.display_cursor(null,null,'ADVANCED  ALLSTATS LAST PEEKED_BINDS'));

PLAN_TABLE_OUTPUT

--------------------------------------------------------------------------------------------------------

--------------------------------------------------------------------------------------------------------

SQL_ID  7zrgxh35ctntg, childnumber 2

-------------------------------------

select count(1) from test

Plan hash value: 1950795681

---------------------------------------------------------------------------------------------------

| Id  | Operation          | Name | Starts | E-Rows | Cost(%CPU)| E-Time   | A-Rows |   A-Time  |

---------------------------------------------------------------------------------------------------

|   0 | SELECT STATEMENT   |     |      1 |        |    2 (100)|          |      1 |00:00:00.01 |

|   1 |  SORT AGGREGATE    |     |      1 |      1 |            |          |     1 |00:00:00.01 |

|   2 |   TABLE ACCESS FULL| TEST |      1 |     1 |     2   (0)| 00:00:01 |      0 |00:00:00.01 |

---------------------------------------------------------------------------------------------------

Query Block Name / Object Alias (identified by operation id):

-------------------------------------------------------------

1 - SEL$1

2 - SEL$1 / TEST@SEL$1

Outline Data

-------------

/*+

BEGIN_OUTLINE_DATA

IGNORE_OPTIM_EMBEDDED_HINTS

OPTIMIZER_FEATURES_ENABLE('11.2.0.1')

DB_VERSION('11.2.0.1')

ALL_ROWS

OUTLINE_LEAF(@"SEL$1")

FULL(@"SEL$1""TEST"@"SEL$1")

END_OUTLINE_DATA

*/

Column Projection Information (identified by operation id):

-----------------------------------------------------------

1 - (#keys=0) COUNT(*)[22]

Note

-----

- dynamic sampling used forthis statement (level=2)

43 rows selected.

--ok,已经非常详细了,但好像缺了点什么,数据块的读取,没有显示,换个工具autotrace

SQL> set autotrace on;

SP2-0618: Cannot find the Session Identifier.  Check PLUSTRACE role is enabled

SP2-0611: Error enabling STATISTICS report

--显示需要一个角色名叫做 PLUSTRACE

--查询官方文档 PLUSTRACE是需要自己创建的一个角色,代码在@$ORACLE_HOME/sqlplus/admin/plustrce.sql

--代码如下

[oracle@panyc admin]$ cat $ORACLE_HOME/sqlplus/admin/plustrce.sql

--

-- Copyright (c) Oracle Corporation 1995, 2002.  All Rights Reserved.

--

-- NAME

--   plustrce.sql

--

-- DESCRIPTION

--   Creates a role with accessto Dynamic Performance Tables

--   for the SQL*Plus SETAUTOTRACE ... STATISTICS command.

--   After this script hasbeen run, each user requiring access to

--   the AUTOTRACE featureshould be granted the PLUSTRACE role by

--   the DBA.

--

-- USAGE

--   sqlplus"sys/knl_test7 as sysdba" @plustrce

--

--   Catalog.sql must havebeen run before this file is run.

--   This file must be runwhile connected to a DBA schema.

set echo on

drop role plustrace;

create role plustrace;

grant select on v_$sesstat to plustrace;

grant select on v_$statname to plustrace;

grant select on v_$mystat to plustrace;

grant plustrace to dba with admin option;

set echo off

--从代码上看出,还需要三张表的权限

SQL> grant select on v_$sesstat to tempuser;

Grant succeeded.

SQL> grant select on v_$statname to tempuser;

Grant succeeded.

SQL> grant select on v_$mystat to tempuser;

Grant succeeded.

--这个时候就不报错了。

SQL>set autotrace on;

SQL>

SQL> select count(1) from test;

COUNT(1)

----------

0

Execution Plan

----------------------------------------------------------

Plan hash value: 1950795681

-------------------------------------------------------------------

| Id  | Operation          | Name | Rows  | Cost (%CPU)| Time     |

-------------------------------------------------------------------

|   0 | SELECT STATEMENT   |     |     1 |     2  (0)| 00:00:01 |

|   1 |  SORT AGGREGATE    |     |     1 |            |          |

|   2 |   TABLE ACCESS FULL| TEST |     1 |    2   (0)| 00:00:01 |

-------------------------------------------------------------------

Note

-----

- dynamic sampling used forthis statement (level=2)

Statistics

----------------------------------------------------------

0  recursive calls

0  db block gets

0  consistent gets

0  physical reads

0  redo size

345  bytes sent via SQL*Net toclient

364  bytes received via SQL*Netfrom client

2  SQL*Net roundtrips to/fromclient

0  sorts (memory)

0  sorts (disk)

1 rows processed

--注意:红色部分是只有autotrace显示的。

3.结论

使用dbms_xplan.display_cursor(基于内部视图)

必要的表:V_$SESSION,V_$SQL_PLAN,V_$SQL

高级统计:V_$SQL_PLAN_STATISTICS_ALL

其他环境变量:statistics_level =all 或者 hints

使用autotrace(基于plan_table)

必要的表:plan_table

高级统计: v_$sesstat,v_$statname,v_$mystat

普通用户获取详细执行计划需要哪些权限相关推荐

  1. Oracle中SQL调优(SQL TUNING)之最权威获取SQL执行计划大全

    该文档为根据相关资料整理.总结而成,主要讲解Oracle数据库中,获取SQL语句执行计划的最权威.最正确的方法.步骤,此外,还详细说明了每种方法中可选项的意义及使用方法,以方便大家和自己日常工作中查阅 ...

  2. 分组后分页_SQL(约束、视图、分页、序列、索引、同义词、创建用户,为用户授权、执行计划的使用 数据的导入导出)...

    学习主题:SQL 学习目标: 掌握约束 掌握视图 修改表名与删除表 删除表中的列语句的语法结构是什么? 答:delete 表名from table where ; 删除表中的列语句的语法结构是什么? ...

  3. java获取mysql执行计划_好程序员Java学习路线之MySQL的执行计划

    好程序员 Java 学习路线之 MySQL 的执行计划.什么是执行计划? 执行计划通常是开发者优化 SQL 语句的第一步. MySQL 在解析 SQL 语句时,会生成多套执行方案,然后内部会进行一个成 ...

  4. 《高性能SQL调优精要与案例解析》一书谈主流关系库SQL调优(优化TUNING)技术精髓之——执行计划获取及理解

    <高性能SQL调优精要与案例解析>中,主要以Oracle为样本讲解了SQL调优(优化&TUNING),其中,前面博文中本人也说到,就SQL调优的思路.方法和步骤来说,各关系库几乎是 ...

  5. 【DB笔试面试600】在Oracle中,如何获取SQL历史执行计划?

    ♣题目 部分 在Oracle中,如何获取SQL历史执行计划? ♣答案部分 历史执行计划只能从AWR中获取,如果AWR没有记录的话,那么就无法获取历史执行计划了,获取历史执行计划的命令如下所示: 1SE ...

  6. Oracle执行计划稳固

    文章目录 0.参考资料 1.查看执行计划&指标解读 1.1.查看执行计划 1.1.1.explain plan命令 1.1.2.DBMS_XPLAN包 1.1.3.DISPLAY_SQL_PL ...

  7. Oracle查看执行计划的几种方法

    Oracle查看执行计划的几种方法 一般来说,有如下几种获取执行计划的方式: 1.AUTOTRACE方式 AUTOTRACE是Oracle自带的客户端工具SQL*Plus的一个特性.启用AUTOTRA ...

  8. 改造Benchmark SQL适配OceanBase开源版数据库跑TPC-C查看执行计划

    改造Benchmark SQL5及SQL表性能调优适配OceanBase开源版数据库跑TPC-C测试 作者:马顺华 从事运维管理工作多年,目前就职于六棱镜(杭州)科技有限公司,熟悉运维自动化.Ocea ...

  9. Oracle 执行计划

    Oracle执行计划是什么 关于执行计划的概念,相信大家都有过基础的了解.这里不详细解释概念性东西,只需要知道.执行计划是Oracle根据SQL语句生成的一个执行步骤的表述即可. 执行计划分三部分:1 ...

最新文章

  1. 地理坐标xy表示什么_建筑测量xy坐标的区别
  2. hashmap是散列表吗_一篇文章教你读懂哈希表-HashMap
  3. android 多行 对齐方式,android – 按钮与多行文字下沉对齐线,如何解决?
  4. luogu P2241 统计方形
  5. Xor sum HDU - 6955
  6. 美国人与欧洲人为什么都吃转基因食品?
  7. UVa12107 (120ms)代码
  8. linux 加快系统时间,修改linux系统时间的方法
  9. 《深入理解Linux内核》笔记1:内存寻址
  10. 预防 Android Dex 64k Method Size Limit
  11. Linux基础知识 | vi编辑器
  12. 计算机测绘程序设计实验报告,计算机测绘程序及设计实验报告.doc
  13. 详细教程:在电脑上安装linux系统
  14. 场景设计题 汇总 (一)
  15. 【职场攻略】职场社交之三大巧言攻略
  16. 正则表达式验证手机号码是否正确
  17. matlab画图五角星标记,Matlab---画图线型、符号及颜色
  18. 电脑任务栏消失解决办法
  19. 十多天的鸭子得了心包积液是什么原因鸭摇头晃脑不吃食怎么治疗
  20. Headlike设计模式幕布笔记

热门文章

  1. 一种使用可满足性模数理论模型检查可编程逻辑控制器系统的恶意软件检测方法
  2. Redis 知识收集
  3. Linux中的管道和过滤器
  4. 微软中国正式宣布Win10政府版:专属定制安全功能
  5. python绘制中国_使用python绘制中国地图
  6. java调用银海社保接口_[开源] C# 封装 银海医保的接口
  7. 后台系统设计——角色权限
  8. 如何在华为云软件开发云上运行Python
  9. Python 3网络爬虫开发实战
  10. 百亿互刷宝php 站长,百度排名百亿互刷宝