oracle_慢SQL的优化过程(awr报表)



怎么样判断系统运行慢,或者SQL运行慢原因以及解决办法?
第一步:判断哪个应用进程消耗资源
查看CPU的信息:
[root@alimysql03 ~]# top     #top查看cup的资源和内存利用率,磁盘io等问题:主要看%CPU,MEM,WA等参数,按1可以查看多
个CPU的信息。
top - 09:55:39 up 41 days, 1 min,  2 users,  load average: 0.02, 0.04, 0.05
Tasks: 144 total,   2 running, 141 sleeping,   1 stopped,   0 zombie
%Cpu0  :  1.0 us,  0.3 sy,  0.0 ni, 98.6 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu1  :  1.0 us,  0.0 sy,  0.0 ni, 99.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  8011076 total,  1588524 free,  2358156 used,  4064396 buff/cache
KiB Swap:  8388604 total,  7984112 free,   404492 used.  2923288 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                          
18979 oracle    -2   0 2845172  17540  14412 S   98.7  0.2 134:43.63 oracle                                                                  
16154 mysql     20   0 10.144g 763720   5924 S   2.0  9.5 658:07.26 mysqld 
查看io的信息:
iostat主要用于监控系统设备的IO负载情况,iostat首次运行时显示自系统启动开始的各项统计信
息,之后运行iostat将显示自上次运行该命令以后的统计信息。用户可以通过指定统计的次数和时间来获得所需的统计信息
[root@alimysql03 ~]# iostat -d  -k 3
参数 -d 表示,显示设备(磁盘)使用状态;-k某些使用block为单位的列强制使用Kilobytes为单位;2表示,数据显示每隔2秒刷新一次。
Linux 3.10.0-514.el7.x86_64 (alimysql03)  2017年11月27日  _x86_64_ (2 CPU)

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda               0.61         3.19        18.31   11304036   64868149
sdb               0.11         2.02         7.11    7175028   25182752
dm-0              0.74         5.20        25.30   18442140   89639957
dm-1              0.03         0.00         0.12       7144     408740
tps:该设备每秒的传输次数(Indicate the number of transfers per second that were issued to the device.)。"一次传输"意
思是"一次I/O请求"。多个逻辑请求可能会被合并为"一次I/O请求"。"一次传输"请求的大小是未知的。
kB_read/s:每秒从设备(drive expressed)读取的数据量;
kB_wrtn/s:每秒向设备(drive expressed)写入的数据量;
kB_read:读取的总数据量;
kB_wrtn:写入的总数量数据量;这些单位都为Kilobytes。

[root@alimysql03 ~]# iostat -d -x  -m 3
Linux 3.10.0-514.el7.x86_64 (alimysql03)  2017年11月27日  _x86_64_ (2 CPU)

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.00     0.04    0.12    0.49     0.00     0.02    70.88     0.01   19.17   11.84   20.99   0.76   0.05
sdb               0.00     0.01    0.05    0.07     0.00     0.01   164.19     0.00   30.40   11.76   43.43   0.51   0.01
dm-0              0.00     0.00    0.17    0.58     0.01     0.02    81.99     0.02   23.02   11.88   26.20   0.68   0.05
dm-1              0.00     0.00    0.00    0.03     0.00     0.00     8.01     0.00   14.99    5.87   15.13   0.04   0.00
rrqm/s:每秒这个设备相关的读取请求有多少被Merge了(当系统调用需要读取数据的时候,VFS将请求发到各个FS,如果FS发现不同的读取
请求读取的是相同Block的数据,FS会将这个请求合并Merge);wrqm/s:每秒这个设备相关的写入请求有多少被Merge了。

rsec/s:每秒读取的扇区数;
wsec/:每秒写入的扇区数。
rKB/s:The number of read requests that were issued to the device per second;
wKB/s:The number of write requests that were issued to the device per second;
avgrq-sz 平均请求扇区的大小
avgqu-sz 是平均请求队列的长度。毫无疑问,队列长度越短越好。   
await:  每一个IO请求的处理的平均时间(单位是微秒毫秒)。这里可以理解为IO的响应时间,一般地系统IO响应时间应该低于5ms,如果
          大于10ms就比较大了。
         这个时间包括了队列时间和服务时间,也就是说,一般情况下,await大于svctm,它们的差值越小,则说明队列时间越短,反之差值越
         大,队列时间越长,说明系统出了问题。
svctm    表示平均每次设备I/O操作的服务时间(以毫秒为单位)。如果svctm的值与await很接近,表示几乎没有I/O等待,磁盘性能很好,如
         果await的值远高于svctm的值,则表示I/O队列等待太长,         系统上运行的应用程序将变慢。
%util: 在统计时间内所有处理IO时间,除以总共统计时间。例如,如果统计间隔1秒,该设备有0.8秒在处理IO,而0.2秒闲置,那么该设备
         的%util = 0.8/1 = 80%,所以该参数暗示了设备的繁忙程度
        一般地,如果该参数是100%表示设备已经接近满负荷运行了(当然如果是多磁盘,即使%util是100%,因为磁盘的并发能力,所以磁盘使用未必就到了瓶颈)。


查看网络信息:
Netstat 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态 (Interface Statistics),masquerade 连接,多播成员 (Multicast Memberships) 等等
[root@alimysql03 ~]# netstat -t
[root@alimysql03 ~]# netstat -u
[root@alimysql03 ~]# netstat -alop
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name     Timer
tcp        0      0 localhost:6379          0.0.0.0:*               LISTEN      31334/redis-server   off (0.00/0/0)
tcp        0      0 alimysql03:ssh          192.168.75.161:54628    ESTABLISHED 27722/sshd: root@pt  keepalive (4256.28/0/0)
tcp        0      0 alimysql03:39710        alimysql03:24913        ESTABLISHED 16154/mysqld         off (0.00/0/0)
tcp        0      0 alimysql03:ssh          192.168.75.162:52753    ESTABLISHED 29032/sshd: root@pt  keepalive (5075.48/0/0)
tcp        0      0 alimysql03:24913        alimysql03:39712        ESTABLISHED 16154/mysqld         off (0.00/0/0)
tcp6       0      0 alimysql03:mysql        alimysql05:38306        ESTABLISHED 16154/mysqld         keepalive (3797.49/0/0)
tcp6       0      0 alimysql03:mysql        alimysql04:47580        TIME_WAIT   -                    timewait (1.84/0/0)
tcp6       0      0 alimysql03:mysql        alimysql05:38304        ESTABLISHED 16154/mysqld         keepalive (3797.49/0/0)
udp        0      0 localhost:323           0.0.0.0:*                           673/chronyd          off (0.00/0/0)

Proto RefCnt Flags       Type       State         I-Node   PID/Program name     Path
unix  2      [ ACC ]     STREAM     LISTENING     4263722  1/systemd            /var/run/rpcbind.sock
unix  2      [ ACC ]     STREAM     LISTENING     9791     1/systemd            /run/systemd/private
unix  2      [ ACC ]     STREAM     LISTENING     4241663  8624/mysqld          /opt/mysql/mysql3307.sock
unix  2      [ ACC ]     STREAM     LISTENING     9799     1/systemd            /run/lvm/lvmetad.socket
unix  2      [ ]         DGRAM                    9832     1/systemd            /run/systemd/shutdownd
unix  2      [ ACC ]     STREAM     LISTENING     9834     1/systemd            /run/lvm/lvmpolld.socket
unix  2      [ ]         DGRAM                    1387     1/systemd            /run/systemd/notify
unix  2      [ ]         DGRAM                    1389     1/systemd            /run/systemd/cgroups-agent


第二步:制作AWR报表
[root@alimysql03 ~]#su - oracle
[oracle@alimysql03 ~]#sqlplus / as sysdba
sys as sysdba
--调用脚本,生成文件
SQL> @?/rdbms/admin/awrrpt.sql
输入报告参数
输入生成报告类型,目前AWR提供txt和html两种格式。需要确认生成格式,默认是html格式。
html
报告涉及天数范围
3
输入开始和结束的snapshot编号
输入天数信息后,AWR生成代码会将天数范围内的snapshot镜像点列出,供输入选择
Enter value for begin_snap: 1796
Begin Snapshot Id specified: 1796
Enter value for end_snap: 1813 
确定报告名称
最后就是确定生成报告的名称。一般采用默认的名称就可以了
于是,指定目录上可以看到相应的报告文件。
第二个就是调用脚本的方式问题。调用时使用的sqlplus客户端可以在Oracle服务器本机上(远程登录),也可以在客户端机器本
机上。笔者建议是在客户端本机上进行生成,这样可以避免报告文件来回拷贝的工作。但是最好要保证客户端版本与服务器版本相匹配。


第三步查看AWR报表,找出问题的SQL或者系统在哪里出现问题
SQL ordered by Elapsed Time
Resources reported for PL/SQL code includes the resources used by all SQL statements called by the code.
% Total DB Time is the Elapsed Time of the SQL statement divided into the Total Database Time multiplied by 100
%Total - Elapsed Time as a percentage of Total DB time
%CPU - CPU Time as a percentage of Elapsed Time
%IO - User I/O Time as a percentage of Elapsed Time
Captured SQL account for 99.0% of Total DB Time (s): 7,366
Captured PL/SQL account for 0.0% of Total DB Time (s): 7,366
Elapsed Time (s)Executions Elapsed Time per Exec (s) %Total %CPU %IO SQL Id SQL Module SQL Text
7,163.06 20,563 0.35 97.24 99.96 0.00 a2tdryafmbwch OGG-RJRWZ2ZX-OPEN_DATA_SOURCE DELETE FROM "JRWZ2_ZX"."JS_ZX_...
54.38 3 18.13 0.74 99.90 0.00 gf507afc2c36b TOAD 12.1.0.22 select sql_text from v$sql whe...
29.07 32 0.91 0.39 99.81 0.00 bps65v7v04b9h TOAD 12.1.0.22 SELECT a.sid, decode(b.class, ...
14.19 66 0.21 0.19 99.80 0.00 dzm7tjg4ksc0b TOAD background query session Select lk.SID, se.username, se...
8.17 1 8.17 0.11 21.74 77.77 abmvfc90dzky0 TOAD 12.1.0.22 select count(1) from JRWZ2_ZX....
6.87 1 6.87 0.09 22.59 79.38 40ycagu7bv1gv TOAD 12.1.0.22 select count(1) from jrwz2_zx....
2.50 156 0.02 0.03 99.09 0.00 dtgnyrc4v3tk4 TOAD 12.1.0.22 SELECT round(bitand(s.ownerid,...
2.46 3 0.82 0.03 87.72 0.00 6btpzpwsbw52s TOAD background query session SELECT sid, owner, type, objec...
1.54 28 0.05 0.02 99.84 0.00 4q2wng79hbc1w TOAD 12.1.0.22 select o.sid, o.sql_text, o.ad...
0.82 55 0.01 0.01 98.85 0.00 6zzd74gqqndf2 TOAD 12.1.0.22 SELECT round(bitand(s.ownerid,...
Back to SQL Statistics
Back to Top
a2tdryafmbwch这条sql_id的执行状态: Elapsed Time花费时间为7163秒,Executions重复执行次数为20563次,%CPU为99.96


SQL ordered by CPU Time
Resources reported for PL/SQL code includes the resources used by all SQL statements called by the code.
%Total - CPU Time as a percentage of Total DB CPU
%CPU - CPU Time as a percentage of Elapsed Time
%IO - User I/O Time as a percentage of Elapsed Time
Captured SQL account for 99.6% of Total CPU Time (s): 7,298
Captured PL/SQL account for 0.0% of Total CPU Time (s): 7,298
CPU Time (s) Executions CPU per Exec (s) %Total Elapsed Time (s) %CPU %IO SQL Id SQL Module SQL Text
7,159.86 20,563 0.35 98.10 7,163.06 99.96 0.00 a2tdryafmbwch OGG-RJRWZ2ZX-OPEN_DATA_SOURCE DELETE FROM "JRWZ2_ZX"."JS_ZX_...
54.33 3 18.11 0.74 54.38 99.90 0.00 gf507afc2c36b TOAD 12.1.0.22 select sql_text from v$sql whe...
29.02 32 0.91 0.40 29.07 99.81 0.00 bps65v7v04b9h TOAD 12.1.0.22 SELECT a.sid, decode(b.class, ...
14.16 66 0.21 0.19 14.19 99.80 0.00 dzm7tjg4ksc0b TOAD background query session Select lk.SID, se.username, se...
2.48 156 0.02 0.03 2.50 99.09 0.00 dtgnyrc4v3tk4 TOAD 12.1.0.22 SELECT round(bitand(s.ownerid,...
2.16 3 0.72 0.03 2.46 87.72 0.00 6btpzpwsbw52s TOAD background query session SELECT sid, owner, type, objec...
1.78 1 1.78 0.02 8.17 21.74 77.77 abmvfc90dzky0 TOAD 12.1.0.22 select count(1) from JRWZ2_ZX....
1.55 1 1.55 0.02 6.87 22.59 79.38 40ycagu7bv1gv TOAD 12.1.0.22 select count(1) from jrwz2_zx....
1.53 28 0.05 0.02 1.54 99.84 0.00 4q2wng79hbc1w TOAD 12.1.0.22 select o.sid, o.sql_text, o.ad...
0.81 55 0.01 0.01 0.82 98.85 0.00 6zzd74gqqndf2 TOAD 12.1.0.22 SELECT round(bitand(s.ownerid,...
Back to SQL Statistics
Back to Top


SQL ordered by User I/O Wait Time
Resources reported for PL/SQL code includes the resources used by all SQL statements called by the code.
%Total - User I/O Time as a percentage of Total User I/O Wait time
%CPU - CPU Time as a percentage of Elapsed Time
%IO - User I/O Time as a percentage of Elapsed Time
Captured SQL account for 73.6% of Total User I/O Wait Time (s): 18
Captured PL/SQL account for 0.6% of Total User I/O Wait Time (s): 18
User I/O Time (s) Executions UIO per Exec (s) %Total Elapsed Time (s) %CPU %IO SQL Id SQL Module SQL Text
6.35 1 6.35 35.02 8.17 21.74 77.77 abmvfc90dzky0 TOAD 12.1.0.22 select count(1) from JRWZ2_ZX....
5.45 1 5.45 30.05 6.87 22.59 79.38 40ycagu7bv1gv TOAD 12.1.0.22 select count(1) from jrwz2_zx....
0.62 2 0.31 3.43 0.66 2.42 94.04 350myuyx0t1d6   insert into wrh$_tablespace_st...
0.25 1 0.25 1.40 0.27 5.13 93.34 a6ktvdq2g8q99 TOAD 12.1.0.22 SELECT ou.NAME owner, oc.NAME ...
0.11 2 0.06 0.62 0.31 61.32 36.34 6ajkhukk78nsr   begin prvt_hdm.auto_execute( :...
0.07 2 0.04 0.39 0.07 5.39 96.12 4bh0c6kf1dw2q TOAD 12.1.0.22 select count(1) from jrwz2_zx....
0.06 1 0.06 0.34 0.06 1.57 96.39 83yqh77vjh1jr TOAD 12.1.0.22 SELECT o.owner, o.object_name,...
0.06 36 0.00 0.32 0.06 12.52 90.20 3m8smr0v7v1m6   INSERT INTO sys.wri$_adv_messa...
0.06 1 0.06 0.31 0.08 24.55 73.69 fnk7155mk2jq6   insert into wrh$_sysmetric_his...
0.06 1 0.06 0.31 0.06 1.74 98.25 apw0wpatc3pu8 TOAD 12.1.0.22 Select owner, object_name, obj...
[oracle@bspdev test]$ ls -l
total 508
-rw-r--r--. 1 oracle oinstall 515262 Jun 21 13:10 awrrpt_1_1796_1813.html


找出有问题的SQL:sql_id为a2tdryafmbwch   花费时间7,163.06秒 20,563 0.35 97.24 99.96 0.00 a2tdryafmbwch OGG-RJRWZ2ZX-OPEN_DATA_SOURCE 
如果SQL不在awr报表中,可以通过模糊查询找到这个SQL,例如:
--1.执行一个SQL
SELECT /* TOTO */ ename, dname
FROM dept d join emp e USING (deptno);
--2.获取这个SQL的sql_id和 child_number
SELECT sql_id, child_number
FROM v$sql
WHERE sql_text LIKE '%TOTO%';
SQL_ID         CHILD_NUMBER
----------     -----------------------------
gwp663cqh5qbf   0


--3.根据sql_id就可以显示刚才那个SQL的执行计划
select  * from table(DBMS_XPLAN.DISPLAY_CURSOR('a2tdryafmbwch',0,'all'))
select  * from  v$sql where sql_id='a2tdryafmbwch'
sql_id表示存储在cursor cache中的SQL语句的id,child_number用于指示缓存sql语句计划的子id,format参数用于控制包含在输出中的信息类型,官档的参数如下:
1.BASIC: 显示最少的信息,只包括操作类型,ID名称和选项。
2.TYPICAL: 默认值,显示相关信息以及某些附加的显示选项,如分区和并发使用等。
3.SERIAL: 与TYPICAL类型相似,区别是它不包括并发的信息,即使是并行执行的计划。
4.ALL: 显示最多的信息,包含了TYPICAL的全部以及更多的附加信息,如别名和远程调用等

查看执行计划的内容,然后判断哪里有问题
PLAN_TABLE_OUTPUT
SQL_ID    a2tdryafmbwch,  child  number  0
-------------------------------------
DELETE  FROM  "JRWZ2_ZX"."JS_ZX_JYDX_CJB"    WHERE  "BZ"  =  :b0  AND  "SSSQ"  = 
:b1  AND  "GF_NSRSBH"  =  :b2  AND  "XF_NSRSBH"  =  :b3  AND  "JE"  =  :b4  AND  "SE" 
=  :b5  AND  "LRSJ"  =  :b6  AND  "NSRSBH"  =  :b7  AND  ROWNUM  =  1
 
Plan  hash  value:  54941260
--------------------------------------------------------------------------------------------------------
|  Id    |  Operation                                          |  Name                                      |  Rows    |  Bytes  |  Cost  (%CPU)|  Time          |
--------------------------------------------------------------------------------------------------------
|     0  |  DELETE  STATEMENT                            |                    |              |              |        23  (100)|                    |
|      1  |    DELETE                                              |  JS_ZX_JYDX_CJB                  |              |              |                        |                    |
|*    2  |      COUNT  STOPKEY                              |                                                |              |              |                        |                    |
|*    3  |        TABLE  ACCESS  BY  INDEX  ROWID|  JS_ZX_JYDX_CJB                  |          1  |        81  |        23      (0)|  00:00:01  |
|*    4  |          INDEX  RANGE  SCAN                    |  IDX_JS_ZX_JYDX_CJB_NSR  |      445  |              |          4      (0)|  00:00:01  |
--------------------------------------------------------------------------------------------------------

Predicate  Information  (identified  by  operation  id):
--------------------------------------------------- 
      2  -  filter(ROWNUM=1)
      3  -  filter(("GF_NSRSBH"=:B2  AND  "XF_NSRSBH"=:B3  AND  "SSSQ"=:B1  AND  "BZ"=:B0  AND 
                            "JE"=TO_NUMBER(:B4)  AND  "SE"=TO_NUMBER(:B5)  AND  "LRSJ"=:B6))
      4  -  access("NSRSBH"=:B7)

查看这个表是否有索引,索引是否生效,,这个表的数据总量是多少,重复数据是多少,看下表结构是否有text,blob等内容,是否有高水位,碎片等问题,表是否有问题。


根据执行计划,来判断SQL语句的效率,看是否可以改善。
因为"JRWZ2_ZX"."JS_ZX_JYDX_CJB"表NSRSBH是有建索引,但是有很多重复的数据。然后考虑建个复合索引,尽量确定是唯一的。
create index idx_JS_ZX_JYDX_CJB on JRWZ2_ZX.JS_ZX_JYDX_CJB(GF_NSRSBH,XF_NSRSBH);
然后SQL运行的时间很快就完成了。


  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值