关于秘密不一样的解读:
秘密之所以是秘密是因为它不可告人,于我把它写下来了…
一、数据准备:
-- 解锁scott用户
alter user scott account unlock;
alter user scott identified by tiger;
-- 创建临时表employee_tmp :
create table employee_tmp as select * from employee;
-- 查看数据量:
09:03:03 sql> select count(*) from employee_tmp;
count(*)
----------
10000
elapsed: 00:00:03.11
二、查看当前会话执行的慢sq语句:
col sql_fulltext for a50
col 平均执行时间 for a10
col 总执行时间 for a10
col sql_id for a15
col osuser for a10
col username for a10
select
to_char(sa.last_active_time,'hh24:mi:ss') time,
se.osuser,
se.username,
se.sql_id,
sa.sql_fulltext,
sa.executions "执行次数",
round(sa.elapsed_time / 1000000, 2) || 's' "总执行时间",
round(sa.elapsed_time / 1000000 / sa.executions, 2) || 's' "平均执行时间"
from (select s.osuser, s.username, s.sql_id
from v$session s
where s.username in ('scott') -- 用户名
and s.sql_id is not null
group by s.osuser, s.username, s.sql_id) se
left join v$sqlarea sa
on se.sql_id = sa.sql_id
where sa.executions > 0
and round(sa.elapsed_time / 1000000 / sa.executions, 2) > 0 -- 平均执行时间大于0
and sa.last_active_time > trunc(sysdate); -- 查询当天的数据
time osuser username sql_id sql_fulltext 执行次数 总执行时间 平均执行时
-------- ---------- ---------- --------------- -------------------------------------------------- ---------- ---------- ----------
09:03:27 oracle scott 6rmnz1gbfhd3j select count(*) from employee_tmp 1 3.1s 3.1s
三、开始测试:
-- session 1:执行:11次执行
09:11:08 sql> insert into employee_tmp select * from employee_tmp;
10000 rows created.
elapsed: 00:00:00.04
09:11:32 sql> /
20000 rows created.
elapsed: 00:00:00.01
09:11:44 sql> /
40000 rows created.
elapsed: 00:00:00.03
09:11:45 sql> /
80000 rows created.
elapsed: 00:00:00.05
09:11:45 sql> /
160000 rows created.
elapsed: 00:00:00.09
09:11:46 sql> /
320000 rows created.
elapsed: 00:00:00.19
09:11:47 sql> /
640000 rows created.
elapsed: 00:00:00.31
09:11:47 sql> /
1280000 rows created.
elapsed: 00:00:00.64
09:11:49 sql> /
2560000 rows created.
elapsed: 00:00:01.06
09:11:50 sql> /
5120000 rows created.
elapsed: 00:00:06.57
09:11:58 sql> /
10240000 rows created.
elapsed: 00:00:12.63
– session2:
通过慢sql语句查询到:sql_id:687546kf2qazt 执行11次,总时间:21.62s,平均:1.96s
– session1:
执行一次查询:执行时间:00:00:00.45
09:12:20 sql> select count(*) from employee_tmp;
count(*)
----------
20480000
elapsed: 00:00:00.45
09:16:18 sql>
– session2:
sql_id:6rmnz1gbfhd3j 执行一次,总时间0.45s,与session1的执行时间一致
– session1:
再次执行一次,未执行结束:insert into employee_tmp select * from employee_tmp;
– session2:
查询结果:执行次数还是11次,但time与总执行时间一直在更新
直到session1 执行结束后,执行次数才会 1
四、编写监控脚本:
– 根据上面的实验结果编写慢sql监控脚本思路:
1、以平均时间为条件,大于1s(自己决定)的进行报警。
(因为是平均值,针对于执行次数过多的会延时报警,存在一定的误差)。
2、sql 未执行结束,平均时间也一直在更新。
3、在v$session视图取的sql_id,监控会话正在执行的sql。
4、username in (‘scott’) 指定用户名,避免出现系统sql。
5、监控脚本输出格式:慢sql:条数|阀值
示例:slowsqlnums:3|1s
解释:超过1s的慢sql有3条
6、打印详细的慢sql到日志中,方便查询。
脚本截图:
执行结果:
-- 脚本输出:
-- 当前会话有1条慢sql
[oracle@db~]$ sh check_slowsql.sh
error|slowsqlnums:1|0s
-- 当前会话没有慢sql
[oracle@db~]$ sh check_slowsql.sh
ok
-- 临时输出文件
[oracle@db~]$ cat slowsql.tmp
time:09:20:30|osuser:oracle|username:scott|sql_id:687546kf2qazt|average_elapsed_time:3.45|sqltext:insert into employee_tmp select * from employee_tmp
time:11:18:27|osuser:oracle|username:scott|sql_id:6rmnz1gbfhd3j|average_elapsed_time:1.81|sqltext:select count(*) from employee_tmp
-- 历史慢sql输出文件
[oracle@db~]$ cat slowsql.his
time:09:20:30|osuser:oracle|username:scott|sql_id:687546kf2qazt|average_elapsed_time:3.45|sqltext:insert into employee_tmp select * from employee_tmp
time:09:20:30|osuser:oracle|username:scott|sql_id:687546kf2qazt|average_elapsed_time:3.45|sqltext:insert into employee_tmp select * from employee_tmp
time:09:20:30|osuser:oracle|username:scott|sql_id:687546kf2qazt|average_elapsed_time:3.45|sqltext:insert into employee_tmp select * from employee_tmp
time:11:18:27|osuser:oracle|username:scott|sql_id:6rmnz1gbfhd3j|average_elapsed_time:1.81|sqltext:select count(*) from employee_tmp
time:09:20:30|osuser:oracle|username:scott|sql_id:687546kf2qazt|average_elapsed_time:3.45|sqltext:insert into employee_tmp select * from employee_tmp
time:11:18:27|osuser:oracle|username:scott|sql_id:6rmnz1gbfhd3j|average_elapsed_time:1.81|sqltext:select count(*) from employee_tmp
文章推荐
postgresql | url |
---|---|
《课程笔记:postgresql深入浅出》之 初识postgresql(一) | https://www.modb.pro/db/475817 |
《课程笔记:postgresql深入浅出》之 postgresql源码安装(二) | https://www.modb.pro/db/475933 |
《课程笔记:postgresql深入浅出》之初始化postgresql(三) | https://www.modb.pro/db/479524 |
《课程笔记:postgresql深入浅出》之psql管理工具-常用(四) | https://www.modb.pro/db/479560 |
《课程笔记:postgresql深入浅出》之psql管理工具-高级命令(四) | https://www.modb.pro/db/479559 |
《课程笔记:postgresql深入浅出》之内存与进程(五) | https://www.modb.pro/db/489936 |
《《课程笔记:postgresql深入浅出》之外存&永久存储(六) | https://www.modb.pro/db/502267 |
oracle: | url |
《oracle 自动收集统计信息机制》 | https://www.modb.pro/db/403670 |
《oracle_索引重建—优化索引碎片》 | https://www.modb.pro/db/399543 |
《dba_tab_modifications表的刷新策略测试》 | https://www.modb.pro/db/414692 |
《fy_recover_data.dbf》 | https://www.modb.pro/doc/74682 |
《oracle rac 集群迁移文件操作.pdf》 | https://www.modb.pro/doc/72985 |
《oracle date 字段索引使用测试.dbf》 | https://www.modb.pro/doc/72521 |
《oracle 诊断案例 :因应用死循环导致的cpu过高》 | https://www.modb.pro/db/483047 |
《oracle 慢sql监控脚本》 | https://www.modb.pro/db/479620 |
《oracle 慢sql监控测试及监控脚本.pdf》 | https://www.modb.pro/doc/76068 |
《oracle 脚本实现简单的审计功能》 | https://www.modb.pro/db/450052 |
greenplum: | url |
《pl/java.pdf》 | https://www.modb.pro/doc/70867 |
《gp的资源队列.pdf》 | https://www.modb.pro/doc/67644 |
《greenplum psql客户端免交互执行sql.pdf》 | https://www.modb.pro/doc/69806 |
最后修改时间:2022-09-27 21:29:05
【米乐app官网下载的版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。