SQL调优 - Hints指定索引 解决慢查询案例
来源:互联网 发布:pychram软件运行环境 编辑:程序博客网 时间:2024/06/04 19:48
背景
每当交易高峰时期,可能会暴露一些平时无法发现的问题,机遇和挑战并存。下面聊聊最近解决的一个案例,因为执行计划走错导致慢查询,进而引发应用线程阻塞、线程池爆满,最后应用功能瘫痪。如何标本兼治的解决问题,需要很多思考。
问题分析
step1 应用瘫痪
用户反应某查询功能一直处于加载中,并出现错误提示。查看后台应用日志,调用远程查询服务出现大量超时。
step2 线程池爆满
通过jstack命令来分析查询服务jvm线程堆栈,发现设定的线程池已经满了,而且大部分线程阻塞在了数据库查询阶段(如下图),看来是有很多慢查询。
step3 慢查询的由来 - 错误执行计划
为何忽然出现这么多慢查询?我们来分析一下:
SELECT no, time
FROM tablename
where no = :1
and time >= to_date(:2, 'yyyy-mm-dd')
and time < to_date(:3, 'yyyy-mm-dd')
ORDER BY time DESC
注:条件字段(no、time)分别有索引(idx_no、idx_time)。
经过DBA帮助,分析上段sql的执行计划发现:
有时数据库会走idx_no索引,查询很快
有时会走idx_time索引,查询很慢
解决方案
既然数据库自动生成的执行计划有时会出问题,那么我们可以用hints语句指定当前sql走哪条索引,以固定执行计划。
下面以Oracle为例,添加hints:
SELECT /*+ index(tablename IDX_NO) */ no, time
FROM tablename
where no = :1
and time >= to_date(:2, 'yyyy-mm-dd')
and time < to_date(:3, 'yyyy-mm-dd')
ORDER BY time DESC
如果感觉在sql中添加不方便的话,oracle 10g以上版本提供了SQL Profile方式。
总结思考
这个问题应该一直有,为何在交易高峰时段才表现出来值得去研究。
数据库:平时数据库压力较小,出现几个走错执行计划的慢查询,也只是让数据库压力比均值高出一小部分,性能未受影响。但是,高峰时段数据库本身就处于一个高负载状态,这时出现的慢查询无疑是雪上加霜,接近某个临界点时性能就明显下滑。
应用:慢查询会导致线程阻塞等待,一直占用线程池资源。我们知道,用户在点击查询按钮后发现一直加载,会不知觉多点几遍。这样的话,线程数量暴涨且大部分处于阻塞状态,线程池满了之后应用就会瘫痪掉,使其他正常的接口也无法正常工作。
综上所述,数据层的优化是治本,同时还要借助一些手段来保证不出现雪崩式性能下降。比如,在前台页面添加重复提交限制,尽量避免短时间内产生大量慢查询。
参考资料
Oracle Hints:https://docs.oracle.com/cd/B12037_01/server.101/b10752/hintsref.htm#5156
Oracle SQL Profile:https://docs.oracle.com/database/121/TGSQL/tgsql_profiles.htm#TGSQL596
- SQL调优 - Hints指定索引 解决慢查询案例
- 解决SQL查询速度慢问题
- SQL 强制指定索引加快查询速度
- SQL 强制指定索引加快查询速度
- 采用全文索引解决模糊查询速度慢的问题
- 采用全文索引解决模糊查询速度慢的问题
- 采用全文索引解决模糊查询速度慢的问题
- 采用全文索引解决模糊查询速度慢的问题
- 采用全文索引解决模糊查询速度慢的问题
- 关于索引来解决慢查询的问题
- 通过创建索引解决MySQL数据库查询慢的问题
- 走主键索引的查询sql变慢的问题
- MySQL索引优化分析,SQL优化,慢查询分析
- 解决sql server查询速度慢11个方法
- SQL调优(SQL TUNING)并行查询提示(Hints)之pq_distribute的使用
- MySQL索引与慢查询
- mysql慢查询原因分析与解决(三)——索引及查询优化
- SQL慢查询优化
- Linux下iptables开放端口端示例
- 你只是追逐时髦的码农
- [BZOJ2705] [SDOI2012] Longge的问题 - 欧拉函数
- zjnu 1762 U(想法、线段树)
- 【POJ 1191】 棋盘分割(DP)
- SQL调优 - Hints指定索引 解决慢查询案例
- pat--列出连通集
- OC 中new与alloc/init的区别
- Socket通信模式和URL通信模式
- 欢迎使用CSDN-markdown编辑器
- 银行家算法(1)——概念与举例说明(多进程管理资源分配避免死锁)
- leetcode_065 Valid Number
- SVM-4-核函数
- windows SDK程序的模板