普通用户获取详细执行计划需要哪些权限
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$SESSION的select权限
--赋权
SQL> grant select on v_$session to tempuser;
Grant succeeded.
--这里注意对象是 v_$session而不是我们经常使用的 v$session因为v$session是v_$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的执行计划,首先需要该sql的sql 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
普通用户获取详细执行计划需要哪些权限相关推荐
- Oracle中SQL调优(SQL TUNING)之最权威获取SQL执行计划大全
该文档为根据相关资料整理.总结而成,主要讲解Oracle数据库中,获取SQL语句执行计划的最权威.最正确的方法.步骤,此外,还详细说明了每种方法中可选项的意义及使用方法,以方便大家和自己日常工作中查阅 ...
- 分组后分页_SQL(约束、视图、分页、序列、索引、同义词、创建用户,为用户授权、执行计划的使用 数据的导入导出)...
学习主题:SQL 学习目标: 掌握约束 掌握视图 修改表名与删除表 删除表中的列语句的语法结构是什么? 答:delete 表名from table where ; 删除表中的列语句的语法结构是什么? ...
- java获取mysql执行计划_好程序员Java学习路线之MySQL的执行计划
好程序员 Java 学习路线之 MySQL 的执行计划.什么是执行计划? 执行计划通常是开发者优化 SQL 语句的第一步. MySQL 在解析 SQL 语句时,会生成多套执行方案,然后内部会进行一个成 ...
- 《高性能SQL调优精要与案例解析》一书谈主流关系库SQL调优(优化TUNING)技术精髓之——执行计划获取及理解
<高性能SQL调优精要与案例解析>中,主要以Oracle为样本讲解了SQL调优(优化&TUNING),其中,前面博文中本人也说到,就SQL调优的思路.方法和步骤来说,各关系库几乎是 ...
- 【DB笔试面试600】在Oracle中,如何获取SQL历史执行计划?
♣题目 部分 在Oracle中,如何获取SQL历史执行计划? ♣答案部分 历史执行计划只能从AWR中获取,如果AWR没有记录的话,那么就无法获取历史执行计划了,获取历史执行计划的命令如下所示: 1SE ...
- Oracle执行计划稳固
文章目录 0.参考资料 1.查看执行计划&指标解读 1.1.查看执行计划 1.1.1.explain plan命令 1.1.2.DBMS_XPLAN包 1.1.3.DISPLAY_SQL_PL ...
- Oracle查看执行计划的几种方法
Oracle查看执行计划的几种方法 一般来说,有如下几种获取执行计划的方式: 1.AUTOTRACE方式 AUTOTRACE是Oracle自带的客户端工具SQL*Plus的一个特性.启用AUTOTRA ...
- 改造Benchmark SQL适配OceanBase开源版数据库跑TPC-C查看执行计划
改造Benchmark SQL5及SQL表性能调优适配OceanBase开源版数据库跑TPC-C测试 作者:马顺华 从事运维管理工作多年,目前就职于六棱镜(杭州)科技有限公司,熟悉运维自动化.Ocea ...
- Oracle 执行计划
Oracle执行计划是什么 关于执行计划的概念,相信大家都有过基础的了解.这里不详细解释概念性东西,只需要知道.执行计划是Oracle根据SQL语句生成的一个执行步骤的表述即可. 执行计划分三部分:1 ...
最新文章
- 地理坐标xy表示什么_建筑测量xy坐标的区别
- hashmap是散列表吗_一篇文章教你读懂哈希表-HashMap
- android 多行 对齐方式,android – 按钮与多行文字下沉对齐线,如何解决?
- luogu P2241 统计方形
- Xor sum HDU - 6955
- 美国人与欧洲人为什么都吃转基因食品?
- UVa12107 (120ms)代码
- linux 加快系统时间,修改linux系统时间的方法
- 《深入理解Linux内核》笔记1:内存寻址
- 预防 Android Dex 64k Method Size Limit
- Linux基础知识 | vi编辑器
- 计算机测绘程序设计实验报告,计算机测绘程序及设计实验报告.doc
- 详细教程:在电脑上安装linux系统
- 场景设计题 汇总 (一)
- 【职场攻略】职场社交之三大巧言攻略
- 正则表达式验证手机号码是否正确
- matlab画图五角星标记,Matlab---画图线型、符号及颜色
- 电脑任务栏消失解决办法
- 十多天的鸭子得了心包积液是什么原因鸭摇头晃脑不吃食怎么治疗
- Headlike设计模式幕布笔记