oracle awr 执行计划,AWR(五)-利用AWR生成SQL执行计划(SQLREPORT)并进行优化 | 信春哥,系统稳,闭眼上线不回滚!...
有些时候,我们需要分析占用资源比较大的sql的执行计划,也需要将sql的执行计划以报告的形式反馈给客户,由于AWR报告里的SQL通常都是些变量,因此以命令行方式生成sql的执行计划就很麻烦,而且也不美观,利用awrsqrpt.sql脚本可以生成HTML格式的SQL执行计划,既美观又方便。以下是我写的AWR的一些其他文章,详见列表:
生成HTML的执行计划很简单,如果是生成本地数据库的SQL执行计划,执行awrsqrpt.sql脚本就可以,但是如果需要生成由AWR迁移到本地的数据库的SQL执行计划,就需要使用awrsqrpi.sql脚本出马啦,下面是我演示的步骤。
SQL> @?/rdbms/admin/awrsqrpi
Specify the Report Type
~~~~~~~~~~~~~~~~~~~~~~~
Would you like an HTML report, or a plain text report?
Enter 'html' for an HTML report, or 'text' for plain text
Defaults to 'html'
输入 report_type 的值:
输入您想将SQL执行计划保存为什么格式,目前支持文本和html格式。
输入 report_type 的值: html
Type Specified: html
Instances in this Workload Repository schema
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
DB Id Inst Num DB Name Instance Host
------------ -------- ------------ ------------ ------------
* 1520519778 1 STREAM stream STREAM
1645778343 2 B1ACDB B1ACDB2 acdbs
1645778343 1 B1ACDB B1ACDB1 acdbm
输入 dbid 的值:
选择你要对哪个数据库操作,DB_ID前面有个*号的是本地的数据库,没有*号的是迁移到本地的数据库信息,AWR数据迁移详见上面列表。我选择DB_ID为1645778343的数据库。
输入 dbid 的值: 1645778343
Using 1645778343 for database Id
输入 inst_num 的值:
选择生成哪个节点的SQL执行计划,ORACLE已经列出了一共有DB_ID为1645778343的数据库是RAC环境,一共有2个节点,这里选择对节点1操作。
输入 inst_num 的值: 1
Using 1 for instance number
Specify the number of days of snapshots to choose from
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Entering the number of days (n) will result in the most recent
(n) days of snapshots being listed. Pressing without
specifying a number lists all completed snapshots.
输入 num_days 的值:
输入你想让ORACLE列出哪些快照,这些快照要包含你想生成的SQL执行计划的的快照范围,比如我需要生成9407和9408这两个快照号范围内的一条SQL的执行计划。
输入 num_days 的值: 10
Listing the last 10 days of Completed Snapshots
Snap
Instance DB Name Snap Id Snap Started Level
------------ ------------ --------- ------------------ -----
B1ACDB1 B1ACDB 9373 10 11月 2011 00:00 1
9374 10 11月 2011 01:00 1
9375 10 11月 2011 02:00 1
9376 10 11月 2011 03:00 1
... ...
9406 11 11月 2011 09:00 1
9407 11 11月 2011 10:00 1
9408 11 11月 2011 11:00 1
9409 11 11月 2011 12:00 1
... ...
9551 17 11月 2011 10:00 1
9552 17 11月 2011 11:00 1
9553 17 11月 2011 12:00 1
Specify the Begin and End Snapshot Ids
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
输入 begin_snap 的值:
输入起始快照号,由于我要生成在9407和9408这个时间段的SQL执行计划,所以起始快照号输入9407,结束快照号输入9408。
Specify the Begin and End Snapshot Ids
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
输入 begin_snap 的值: 9407
Begin Snapshot Id specified: 9407
输入 end_snap 的值: 9408
End Snapshot Id specified: 9408
Specify the SQL Id
~~~~~~~~~~~~~~~~~~
输入 sql_id 的值:
输入您要生成的SQL执行计划的SQL_ID,这个SQL_ID一般是AWR报告里占用资源比较大的SQL,比如我想查看AWR报告中SQL ordered by Reads部分占据第一位的SQL的执行计划,下面是AWR报告中SQL ordered by Reads部分占据第一位的SQL信息。
AWR报告显示,SQL_ID为ddjfun7qrf86a的SQL产生了大量的逻辑读,我们要生成这个SQL的执行计划,那么就输入这个SQL_ID–ddjfun7qrf86a。
输入 sql_id 的值: ddjfun7qrf86a
SQL ID specified: ddjfun7qrf86a
Specify the Report Name
~~~~~~~~~~~~~~~~~~~~~~~
The default report file name is awrsqlrpt_1_9407_9408.html. To use this name,
press to continue, otherwise enter an alternative.
输入 report_name 的值:
输入你要将这个执行计划保存到哪个路径下的哪个文件,也就是保存的文件名。
输入 report_name 的值: d:\SQL-9407-9408.html
Using the report name d:\SQL-9407-9408.html
输入完路径之后,开始刷屏(这个通常会很快),跑完之后就可以去刚才输入的路径下去找SQL执行计划的那个文件啦,下面摘录生成SQL执行计划日志的起始和结尾部分。
AWR SQL Report for DB: B1ACDB, Inst: B1ACDB1, Snaps: 9407-9
408, SQL Id: ddjfun7qrf86a
上面是日志的起始部分,列出了DB_ID、操作节点的实例名、快照起止号、SQL_ID。这些部分在生成的SQL执行计划的文件里都有体现。
Report written to d:\SQL-9407-9408.html
上面是日志的结尾部分,也就是告诉您这个SQL的执行计划保存在哪里,叫什么名字,当然这个结尾部分的上面还列出了这个SQL_ID的SQL语句,因为下面有提,此处略。
下面就分析下这个SQL的执行计划,下面是SQL语句。
下面是这个SQL的执行计划:
这个执行计划显示,COST最大的部分就是DSPTRANSFERCOMMAND表的全表扫描,很直观很好看吧,下面摘录我司权威、资深专家对这个SQL的优化案例。
1. 执行该SQL语句,测试SQL的返回结果及消耗时间,发现该SQL语句仅返回一条结果,但耗时较长。
SQL> SELECT MACHINENAME, (processcapacity - processcount) capa,
2 (select count(*) cnt from dsptransfercommand
3 where destinationmachine = '1AFBF01B' and factoryname = 'ARRAY'
4 and requesttype = 'UNLOAD' and CASSETTETYPE = 'FULL' and state in
('MOVING', 'OICCOMMAND') ) as cnt FROM MACHINE WHERE MACHINENAME =
'1AFBF01B' and machinestatename <> 'DOWN';
5 MACHINENAME CAPA CNT
--------------------------------------- ------- ----------
1AFBF01B 0 1
Elapsed: 00:00:11.86
2. 查询dsptransfercommand表的总数据量,在53万条左右,可以考虑在相关列建立索引。
SQL> select count(*) cnt from dsptransfercommand;
CNT
----------
537967
3. 分析dsptransfercommand表上的索引,发现在本SQL语句的相关列destinationmachine、factoryname、requesttype、cassettetype和state上都没有索引。
SQL> select index_name, column_name, column_position from user_ind_columns
where table_name = upper('dsptransfercommand') order by 1, 3;
INDEX_NAME COLUMN_NAME COLUMN_POSITION
-------------------------- --------------------- ---------------------------
DSPTRANSFERCMD_IDX_01 CASSETTENAME 1
DSPTRANSFERCMD_IDX_02 LOTNAME 1
DSPTRANSFERCMD_IDX_03 CREATETIME 1
PK_DSPTRANSFERCOMMAND TRANSFERID 1
PK_DSPTRANSFERCOMMAND CASSETTENAME 2
4. 具体分析destinationmachine,factoryname,factoryname,cassettetype,state这五列,对比这五列唯一键的数量和表的总数据量,发现单列上唯一键的数量都远远小于表的总数据量,因此在单列上建索引,索引的选择性很差,价值不大。考虑以destinationmachine为前导列建复合索引。
SQL> select count(distinct destinationmachine) cdd,
count(distinct factoryname) cdf, count(distinct requesttype) cdr,
count(distinct CASSETTETYPE) cdc, count(distinct state) cds
from dsptransfercommand;
CDD CDF CDR CDC CDS
---------- --------- ---------- ---------- ----------
259 4 4 2 8
5. 以下是复合索引的创建过程
SQL> CREATE INDEX DSPTRANSFERCMD_IDX_04 ON dsptransfercommand(
destinationmachine, factoryname, requesttype, CASSETTETYPE)
2 TABLESPACE MES_DATA_IDX;
6. 测试调优效果
SQL> SELECT MACHINENAME, (processcapacity - processcount) capa,
2 (select count(*) cnt from dsptransfercommand
3 where destinationmachine = '1AFBF01B' and factoryname = 'ARRAY'
4 and requesttype = 'UNLOAD' and CASSETTETYPE = 'FULL' and state
in ('MOVING', 'OICCOMMAND') ) as cnt
5 FROM MACHINE WHERE MACHINENAME = '1AFBF01B' and
machinestatename <> 'DOWN';
MACHINENAME CAPA CNT
----------------- ------------------- ----------
1AFBF01B 0 1
Elapsed: 00:00:00.02
7. 优化结果报告
通过在表dsptransfercommand上建立复合索引,大大降低了SQL语句的执行时间:从原来的11.86秒降低到了0.02秒,优化效果显著。
优化前:
Elapsed: 00:00:11.86
优化后:
Elapsed: 00:00:00.02
8. 优化总结:通过在表dsptransfercommand上建立复合索引,大大降低了SQL语句的执行时间(从原来的11.86秒降低到了0.02秒),逻辑读也从原来的约5万字节降到了4600字节,优化效果显著。
oracle awr 执行计划,AWR(五)-利用AWR生成SQL执行计划(SQLREPORT)并进行优化 | 信春哥,系统稳,闭眼上线不回滚!...相关推荐
- oracle 回滚 drop的表,使用ODU恢复被DROP的表 | 信春哥,系统稳,闭眼上线不回滚!...
本实验模拟使用ODU恢复被DROP掉的表的恢复,有关ODU软件的下载和使用说明详见老熊的BLOG http://www.laoxiong.net 本实验以上一篇文章<使用ODU恢复被TRUNCA ...
- oracle+12c+大表,ORACLE 12C新特性-在线迁移表或分区 | 信春哥,系统稳,闭眼上线不回滚!...
今天测试一下ORACLE 12C的一个新功能-在线移动表或分区,这其实在10g版本就已经支持了,难道是官方文档写错了,先不按照文档描述的去测试,看看是否堆表也可以在线迁移.以下是实验过程: 下面先看下 ...
- oracle 12c undo,Oracle 12C新特性-临时UNDO段(Temporary Undo Segments) | 信春哥,系统稳,闭眼上线不回滚!...
在12C版本,为了减少UNDO表空间的使用率及减少REDO和归档日志的产生量,ORACLE推出了临时UNDO段(Temporary Undo Segments)新特性.这个新特性把临时表产生的UNDO ...
- oracle12c 新增维护时间窗口,ORACLE 12C新特性-自动维护全局索引 | 信春哥,系统稳,闭眼上线不回滚!...
今天在网上看了一篇关于12C新特性-自动维护全局索引的帖子,经测试,貌似根本不是那么回事呀.如果对分区表进行分区DDL操作,如果不加update index字句,全局索引就会失效,下面先看一下是11. ...
- Oracle rman备份集上限,利用RMAN的cate限制RMAN备份速度 | 信春哥,系统稳,闭眼上线不回滚!...
最近有个客户反映,在他们晚上数据库备份的时候,前台反映数据库特别慢,业务无法进行,看了下客户的AWR信息,发现该时段都是I/O相关的等待事件,经和客户沟通,他们没小时都要生成一次报表,这些SQL处理的 ...
- oracle数据泵导入提示00972,oracle数据库使用expdp指定FLASHBACK_TIME遇到ORA-39150错误 | 信春哥,系统稳,闭眼上线不回滚!...
目前正在做一个数据库合并的项目,有一套系统使用分库分表并且读写分离的架构,订单系统和用户系统都是6个写库和6个读库,目前订单系统已经由6个写库合并为3个写库,马上要做用户系统的数据库合并工作,用户系统 ...
- oracle服务未启动失败,windows服务未启动导致 ORA-12560和RMAN-00554错误 | 信春哥,系统稳,闭眼上线不回滚!...
今天,有人在群里问RMAN-00554.RMAN-04005.ORA-12560错误,如下: C:Usersstream>rman target / 恢复管理器: Release 11.2.0. ...
- linux oracle目录权限不够,Linux 目录权限不足导致ORA-39070错误 | 信春哥,系统稳,闭眼上线不回滚!...
同事要做数据迁移测试,需要服务器权限,就在操作系统上给他创建了一个用户wzs,给分了dba组,拥有dba组的用户就可以正常操作数据库,而且可以使用最高权限(SYS). [root@SL010A-IVD ...
- 安装oracle不动了,windows2008安装ORACLE到2%不动的问题 | 信春哥,系统稳,闭眼上线不回滚!...
最近又有网友遇到在windows2008服务器上安装ORACLE软件时到2%就卡住不动的问题,下面是该网友的描述: oralce 11g r2 windows server 2008 R2 安装到最后 ...
最新文章
- css表示第一个元素和最后一个元素,CSS第一个和最后一个子元素
- 宿主机丢失vmnet0和vmnet8网卡
- 160个Crackme030之一元一次方程
- 谷歌浏览器chrome的vuejs devtools 插件的安装
- 【记录】一些平时留意过的
- 乐尚网络:小程序商城零售行业10大新赋能
- hibernate关联关系笔记
- 【转】一个40岁老程序员的前端学习之路|2021 年中总结
- 教你如何判断水泥的质量好坏?
- ENVI5.3.1使用Landsat 8影像进行预处理及分析实例操作
- 2022 HTML + CSS面试题,美女吐血整理
- webQQ协议——获取信息
- 记录:前端框架Bootstrap学习使用之组件——Collapse(折叠)
- 农村淘宝年货节开20条品牌大街,1分钱买高品质牛奶!
- Unregistering application *** with eureka with status DOWN
- Python-3:循环-练习
- 企业微信个人二维码在哪里?会失效吗?
- vue 实现出生日期计算年龄
- 什么是TXT记录?如何设置、检测TXT记录是否生效
- 使用Rook+Ceph在Kubernetes上作持久存储
热门文章
- 莫比乌斯反演小结 + 黑暗爆炸 2301
- HTML代码实现符号及商标
- java石头剪刀布界面_利用Java模拟石头剪刀布游戏
- 【Charles】charles unknown问题解决,及手机代理设置【iOS手机】
- 【bzoj3687】简单题
- C1认证学习三(数据校验)
- 计算机网络营销发展有哪些方面,《网络营销》(PPT124).ppt
- 【15】Vue:02-Vue表单基本操作、表单修饰符、自定义指令、计算属性computed、侦听器watch、过滤器、生命周期、数组变异方法、替换数组、动态数组响应数据、图书列表案例、TODOS案例
- 编程金融小白学 股票期权 lv.5 希腊字母 Delta
- SGD平行算法 - Downpour SGD (单机python多线程版)