通过shell和sql结合查找性能sql

简介:

在生产系统中,会发现一些潜在的sql问题,为了能够及时和准确的定位,我们可以借助sql_monitor来做性能sql的查找。可以在后台启用一个job不定时的去查找。
毕竟大半夜的我们去监控也是有难度的,我们希望一切都能很自然的处理,结果我在一个指定的目录下每隔10分钟去查找一次性能sql,如果当天已经有生成报告就不重新生成了。
结果不到一个多月,生成了800个报告,这么多报告是好事,毕竟已经有了详细的报告和数据,但是如果一下子消化这么多的报告,肯定是有难度,而且没有很强的针对性,可能有些sql在一个月中的几天才会运行。有些sql可能每天都会运行,有些可能就运行一次,很长时间不会再次运行,我们需要关注的就是那些运行频繁的问题sql语句。

-rw-r--r-- 1 prodbuser dba 231786 Aug  5 10:20 c03451mgv0vwu_rpt.lst_140805
-rw-r--r-- 1 prodbuser dba 276935 Jul 29 14:00 c0tua88kkmhny_rpt.lst_140729
-rw-r--r-- 1 prodbuser dba 180899 Jul 21 16:24 c166x1kn4y73a_rpt.lst_140721
-rw-r--r-- 1 prodbuser dba 170178 Jul 29 13:10 c166x1kn4y73a_rpt.lst_140729
-rw-r--r-- 1 prodbuser dba 185278 Aug  5 11:20 c166x1kn4y73a_rpt.lst_140805
-rw-r--r-- 1 prodbuser dba 141035 Jul 29 05:20 c1pvtcxrr9vzu_rpt.lst_140729
-rw-r--r-- 1 prodbuser dba 162326 Aug  4 11:39 c3xwtzv3t21ws_rpt.lst_140804
-rw-r--r-- 1 prodbuser dba 189053 Jul 29 01:39 c55p46kgh6kva_rpt.lst_140729
-rw-r--r-- 1 prodbuser dba 434126 Jul 22 06:27 c7cay05hyg6hj_rpt.lst_140722
-rw-r--r-- 1 prodbuser dba 436240 Jul 25 01:36 c7cay05hyg6hj_rpt.lst_140725
-rw-r--r-- 1 prodbuser dba 428237 Jul 26 05:07 c7cay05hyg6hj_rpt.lst_140726
-rw-r--r-- 1 prodbuser dba 435485 Jul 27 03:08 c7cay05hyg6hj_rpt.lst_140727
-rw-r--r-- 1 prodbuser dba 404379 Jul 28 04:59 c7cay05hyg6hj_rpt.lst_140728
-rw-r--r-- 1 prodbuser dba 440166 Aug  1 03:07 c7cay05hyg6hj_rpt.lst_140801
-rw-r--r-- 1 prodbuser dba 422197 Aug  2 02:18 c7cay05hyg6hj_rpt.lst_140802
-rw-r--r-- 1 prodbuser dba 427935 Aug  3 00:58 c7cay05hyg6hj_rpt.lst_140803
-rw-r--r-- 1 prodbuser dba 299736 Jul 21 17:19 c8hmrrzkwyf9k_rpt.lst_140721
-rw-r--r-- 1 prodbuser dba 343073 Jul 24 08:15 cafq05qjz686u_rpt.lst_140724
-rw-r--r-- 1 prodbuser dba 111137 Jul 25 15:06 cdbz6j8ndw0rj_rpt.lst_140725
-rw-r--r-- 1 prodbuser dba 107362 Aug  5 17:20 cdbz6j8ndw0rj_rpt.lst_140805
-rw-r--r-- 1 prodbuser dba 132277 Jul 21 17:19 cfun4v7jffbsg_rpt.lst_140721
-rw-r--r-- 1 prodbuser dba 176369 Aug  4 17:20 cg4fj6y69nr0g_rpt.lst_140804
-rw-r--r-- 1 prodbuser dba 189053 Aug  2 02:08 cgujc2mdzgkq7_rpt.lst_140802
-rw-r--r-- 1 prodbuser dba 300491 Jul 21 16:22 cjqdgd14xjwjm_rpt.lst_140721
-rw-r--r-- 1 prodbuser dba 272707 Jul 22 11:27 cjqdgd14xjwjm_rpt.lst_140722
-rw-r--r-- 1 prodbuser dba 273764 Jul 23 11:45 cjqdgd14xjwjm_rpt.lst_140723
-rw-r--r-- 1 prodbuser dba 272858 Jul 24 10:25 cjqdgd14xjwjm_rpt.lst_140724
-rw-r--r-- 1 prodbuser dba 283579 Jul 25 01:36 cjqdgd14xjwjm_rpt.lst_140725
-rw-r--r-- 1 prodbuser dba 277992 Jul 26 00:37 cjqdgd14xjwjm_rpt.lst_140726
-rw-r--r-- 1 prodbuser dba 280710 Jul 27 09:28 cjqdgd14xjwjm_rpt.lst_140727
-rw-r--r-- 1 prodbuser dba 282220 Jul 28 05:09 cjqdgd14xjwjm_rpt.lst_140728
-rw-r--r-- 1 prodbuser dba 277690 Jul 30 01:31 cjqdgd14xjwjm_rpt.lst_140730
-rw-r--r-- 1 prodbuser dba 249000 Aug  1 11:58 cjqdgd14xjwjm_rpt.lst_140801
-rw-r--r-- 1 prodbuser dba 296867 Aug  2 13:08 cjqdgd14xjwjm_rpt.lst_140802
-rw-r--r-- 1 prodbuser dba 285240 Aug  3 01:28 cjqdgd14xjwjm_rpt.lst_140803
-rw-r--r-- 1 prodbuser dba 295055 Aug  4 10:49 cjqdgd14xjwjm_rpt.lst_140804

看到这么多的报告都有点晕,不知道该从哪里开始查起。
而且直接在生产环境没有目的的进行语句的执行计划抽取,性能问题也会做很多额外的无用功。

可以使用如下的命令来生成sql语句,然后在其他的环境中运行,做问题sql语句的分析,用sql语句来分析sql语句,这样一物降一物。

ls -l *.lst* |awk '{print $9}'|awk -F_rpt.lst_ '{print "insert into issue_sql values('\''"$1 "'\'', " $2");"}' > issue_sql.sql

生成的sql语句类似下面的形式。

insert into issue_sql values('07aw4r5syzydx', 140818);
insert into issue_sql values('091n6gmzgwxzs', 140805);
insert into issue_sql values('0cdthzpx2jn4q', 140722);
insert into issue_sql values('0cdthzpx2jn4q', 140727);
insert into issue_sql values('0cdthzpx2jn4q', 140729);
insert into issue_sql values('0cdthzpx2jn4q', 140803);
insert into issue_sql values('0cdthzpx2jn4q', 140805);
insert into issue_sql values('0d0n1waazr2fs', 140722);

拷贝到别的环境去。

> scp issue_sql.sql xxxxx@xxxx.19.xxxx.47:~

然后创建一个临时的小表

create table issue_sql (sql_id varchar2(30),sql_date number);     

@issue_sql.sql

然后就开始使用sql语句来分析了,先来一个大概的,看看哪些sql语句出现的频率最高。

select *from (select  sql_id,count(*)cnt from issue_sql group by sql_id) order by cnt desc;

SQL> select *from (select  sql_id,count(*)cnt from issue_sql group by sql_id) order by cnt desc;

SQL_ID                                CNT
------------------------------ ----------
648600hq1s1s8                          25
4gz51fphuarsw                          23
94mgu2k08hm4r                          23
4ad8ypr3nf6vm                          22
2nt0hq33qb1a6                          16

SQL_ID                                CNT
------------------------------ ----------
9q6ta1c5x1nxn                          16
b56c37kvdwn1m                          15
bdyfy49zwbaza                          15
b3dzwjrn3psq7                          15
dg938muvq587v                           2
30kfnx73k75jf                           2
4a1nadt1xpqrf                           2

SQL_ID                                CNT
------------------------------ ----------
9cbk5x6hwq0mu                           2
3rkmrqq7wsvas                           1

比如我们想看看八月份以来哪些sql语句执行频率最高,可以使用如下的方式:

SQL> select *from (select  sql_id,count(*)cnt from issue_sql where sql_date like '1408%' group by sql_id) order by cnt desc;

SQL_ID                                CNT
------------------------------ ----------
648600hq1s1s8                          13
99pnz5pr7tgpb                          13
4ad8ypr3nf6vm                          13
cjqdgd14xjwjm                           4

还可以指定某些天,或者一些更为复杂的判断条件。

本文转自ICT时空 dbasdk博客,原文链接:通过shell和sql结合查找性能sql ,如需转载请自行联系原博主。

相关文章
|
1月前
|
SQL 关系型数据库 MySQL
为什么这些 SQL 语句逻辑相同,性能却差异巨大?
我是小假 期待与你的下一次相遇 ~
135 0
|
5月前
|
SQL 关系型数据库 PostgreSQL
CTE vs 子查询:深入拆解PostgreSQL复杂SQL的隐藏性能差异
本文深入探讨了PostgreSQL中CTE(公共表表达式)与子查询的选择对SQL性能的影响。通过分析两者底层机制,揭示CTE的物化特性及子查询的优化融合优势,并结合多场景案例对比执行效率。最终给出决策指南,帮助开发者根据数据量、引用次数和复杂度选择最优方案,同时提供高级优化技巧和版本演进建议,助力SQL性能调优。
560 1
|
SQL 存储 关系型数据库
如何巧用索引优化SQL语句性能?
本文从索引角度探讨了如何优化MySQL中的SQL语句性能。首先介绍了如何通过查看执行时间和执行计划定位慢SQL,并详细解析了EXPLAIN命令的各个字段含义。接着讲解了索引优化的关键点,包括聚簇索引、索引覆盖、联合索引及最左前缀原则等。最后,通过具体示例展示了索引如何提升查询速度,并提供了三层B+树的存储容量计算方法。通过这些技巧,可以帮助开发者有效提升数据库查询效率。
1059 2
|
8月前
|
SQL 关系型数据库 MySQL
如何优化SQL查询以提高数据库性能?
这篇文章以生动的比喻介绍了优化SQL查询的重要性及方法。它首先将未优化的SQL查询比作在自助餐厅贪多嚼不烂的行为,强调了只获取必要数据的必要性。接着,文章详细讲解了四种优化策略:**精简选择**(避免使用`SELECT *`)、**专业筛选**(利用`WHERE`缩小范围)、**高效联接**(索引和限制数据量)以及**使用索引**(加速搜索)。此外,还探讨了如何避免N+1查询问题、使用分页限制结果、理解执行计划以及定期维护数据库健康。通过这些技巧,可以显著提升数据库性能,让查询更高效流畅。
|
9月前
|
SQL 关系型数据库 OLAP
云原生数据仓库AnalyticDB PostgreSQL同一个SQL可以实现向量索引、全文索引GIN、普通索引BTREE混合查询,简化业务实现逻辑、提升查询性能
本文档介绍了如何在AnalyticDB for PostgreSQL中创建表、向量索引及混合检索的实现步骤。主要内容包括:创建`articles`表并设置向量存储格式,创建ANN向量索引,为表增加`username`和`time`列,建立BTREE索引和GIN全文检索索引,并展示了查询结果。参考文档提供了详细的SQL语句和配置说明。
280 2
|
10月前
|
SQL Oracle 关系型数据库
如何在 Oracle 中配置和使用 SQL Profiles 来优化查询性能?
在 Oracle 数据库中,SQL Profiles 是优化查询性能的工具,通过提供额外统计信息帮助生成更有效的执行计划。配置和使用步骤包括:1. 启用自动 SQL 调优;2. 手动创建 SQL Profile,涉及收集、执行调优任务、查看报告及应用建议;3. 验证效果;4. 使用 `DBA_SQL_PROFILES` 视图管理 Profile。
|
SQL 数据库 UED
SQL性能提升秘籍:5步优化法与10个实战案例
在数据库管理和应用开发中,SQL查询的性能优化至关重要。高效的SQL查询不仅可以提高应用的响应速度,还能降低服务器负载,提升用户体验。本文将分享SQL优化的五大步骤和十个实战案例,帮助构建高效、稳定的数据库应用。
1015 3
|
SQL IDE 数据库连接
IntelliJ IDEA处理大文件SQL:性能优势解析
在数据库开发和管理工作中,执行大型SQL文件是一个常见的任务。传统的数据库管理工具如Navicat在处理大型SQL文件时可能会遇到性能瓶颈。而IntelliJ IDEA,作为一个强大的集成开发环境,提供了一些高级功能,使其在执行大文件SQL时表现出色。本文将探讨IntelliJ IDEA在处理大文件SQL时的性能优势,并与Navicat进行比较。
229 4
|
SQL 存储 缓存
如何优化SQL查询性能?
【10月更文挑战第28天】如何优化SQL查询性能?
816 10
|
SQL 关系型数据库 MySQL
惊呆:where 1=1 可能严重影响性能,差了10多倍,快去排查你的 sql
老架构师尼恩在读者交流群中分享了关于MySQL中“where 1=1”条件的性能影响及其解决方案。该条件在动态SQL中常用,但可能在无真实条件时导致全表扫描,严重影响性能。尼恩建议通过其他条件或SQL子句命中索引,或使用MyBatis的`<where>`标签来避免性能问题。他还提供了详细的执行计划分析和优化建议,帮助大家在面试中展示深厚的技术功底,赢得面试官的青睐。更多内容可参考《尼恩Java面试宝典PDF》。
下一篇
oss云网关配置