一次SQL慢查询的优化处理
背景
在开发完成,数据验证的过程中,需要对两个非常大的表进行query,运行了十几分钟都跑不完。如下:
select * from big_a a, big_b b
where a.some_id = b.some_id
and a.value_one = 'a_111'
and a.value_two = 'a_222'
and b.value_one = 'b_111'
and b.value_two = 'b_222'
假设两个表的数据量非别为M,N,那么查询时间相当于M*N。对两表进行全排列全表搜索,非常耗时。
优化
经同事指点,说可以基于日期加一些filter的条件,这样会快很多。因为该表根据日期做了partition,避免了全表搜索,加快了速度。如下:
select * from big_a a, big_b b
where a.some_id = b.some_id
and a.some_date = 20180101
and b.some_date = 20180101
and a.value_one = 'a_111'
and a.value_two = 'a_222'
and b.value_one = 'b_111'
and b.value_two = 'b_222'
对于某些日期数据量少,查询速度还可以,但是有些日期数据做了full load,量非常大,查询还是很慢。
思考了一下,假设某一天的两表数据量分为m,n,那么查询时间为m*n。因为m,n还是比较大的,所以执行时间还是很长。
解决的思路是对两个表进一步拆分。如下:
select * from
(select * from big_a a
where a.some_date = 20180101
and a.value_one = 'a_111'
and a.value_two = 'a_222')
tmpa
inner join
(select * from big_b b
where b.some_date = 20180101
and b.value_one = 'b_111'
and b.value_two = 'b_222')
tmpb
on tmpa.some_id = tmpb.some_id;
先分别对两表做查询,生成两个tmp表,假设其数据量为m', n',那么总体的执行时间为M+N+m'*n'。一般m', n’非常小,可以忽略不计,即总时间为M+N。
由相乘的数量级变为相加的数量级,速度快了很多。
验证结果
在调优之后,怎么判断调优之后的结果要优于之前的结果?最直接的方法是看运行时间,除此之外,还可以看语句执行的其他信息。如下:
1.直接看软件上显示的时间。
All Rows Fetched: 50 in 1.23 seconds
2.看执行计划。
explain plan for select * from big_big_table;
SELECT plan_table_output FROM TABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE'));
3.看储存语句运行情况数据的表。
v&sql or v&sqlarea
"v&sql lists statistics on shared SQL area without the GROUP BY clause and contains one row for each child of the original SQL text entered.
Statistics displayed in V$SQL are normally updated at the end of query execution. However, for long running queries, they are updated every 5 seconds. This makes it easy to see the impact of long running SQL statements while they are still in progress."
-- Oracle
select
sql_text,
executions,
elapsed_time/1000 total_time,
elapsed_time/nvl(executions,1)/1000 avg_time,
parse_calls,
disk_reads,
buffer_gets,
u.username
from v$sql
left join all_users u
on parsing_user_id = u.user_id
where sql_text like '%select * from big_big_table where id = 12345;%'
order by avg_time desc;
链接
一次SQL慢查询的优化处理的更多相关文章
- SQL SERVER 查询性能优化——分析事务与锁(五)
SQL SERVER 查询性能优化——分析事务与锁(一) SQL SERVER 查询性能优化——分析事务与锁(二) SQL SERVER 查询性能优化——分析事务与锁(三) 上接SQL SERVER ...
- SQL Server 查询性能优化 相关文章
来自: SQL Server 查询性能优化——堆表.碎片与索引(一) SQL Server 查询性能优化——堆表.碎片与索引(二) SQL Server 查询性能优化——覆盖索引(一) SQL Ser ...
- Sql Server查询性能优化之走出索引的误区
据了解绝大多数开发人员对于索引的理解都是一知半解,局限于大多数日常工作没有机会.也什么没有必要去关心.了解索引,实在哪天某个查询太慢了找到查询条件建个索引就ok,哪天又有个查询慢了,再建立个索引就是, ...
- SQL Server查询性能优化——堆表、碎片与索引(二)
本文是对 SQL Server查询性能优化——堆表.碎片与索引(一)的一些总结. 第一:先对 SQL Server查询性能优化——堆表.碎片与索引(一)中的例一的SET STATISTICS IO之 ...
- SQL Server查询性能优化——覆盖索引(二)
在SQL Server 查询性能优化——覆盖索引(一)中讲了覆盖索引的一些理论. 本文将具体讲一下使用不同索引对查询性能的影响. 下面通过实例,来查看不同的索引结构,如聚集索引.非聚集索引.组合索引等 ...
- SET STATISTICS IO和SET STATISTICS TIME 在SQL Server查询性能优化中的作用
近段时间以来,一直在探究SQL Server查询性能的问题,当然也漫无目的的查找了很多资料,也从网上的大神们的文章中学到了很多,在这里,向各位大神致敬.正是受大神们无私奉献精神的影响,所以小弟也作为回 ...
- SQl语句查询性能优化
[摘要]本文从DBMS的查询优化器对SQL查询语句进行性能优化的角度出发,结合数据库理论,从查询表达式及其多种查询条件组合对数据库查询性能优化进行分析,总结出多种提高数据库查询性能优化策略,介绍索引的 ...
- SQL Server 查询性能优化——覆盖索引
覆盖索引又可以称为索引覆盖. 解释一: 就是select的数据列只用从索引中就能够取得,不必从数据表中读取,换句话说查询列要被所使用的索引覆盖. 解释二: 索引是高效找到行的一个方法,当能通过检索索引 ...
- Sql Server查询性能优化之不可小觑的书签查找
小小程序猿SQL Server认知的成长 1.没毕业或工作没多久,只知道有数据库.SQL这么个东东,浑然分不清SQL和Sql Server Oracle.MySql的关系,通常认为SQL就是SQL S ...
随机推荐
- UEditor工具栏上自定义按钮、图标、事件和右击菜单添加自定义按钮
首先我要说是,举例说的这个版本是1.2以上的,因为一些配置代码转移到了zh-cn.js里,其他没有变化.开门见山直接写:(我自定义的是在线美图功能) 第一步:找到ueditor.config.js文件 ...
- python的面向对象和面向过程
一.面向对象和面向过程的区别: a.面向过程: 1)根据业务逻辑从上到下写代码 2)开发思路是将数据和函数按照执行的逻辑顺序组织在一起 3)分开考虑数据与函数 定义性文字: 面向对象编程(Object ...
- 前端js代码优化
今天给大家分享下js代码优化的相关技巧. 1.使用"+"转换为数值 我们平时开发过程中需要将数字字符串创转为number类型,大多数都会用JavaScript parseI ...
- 如何在Python中从零开始实现随机森林
欢迎大家前往云+社区,获取更多腾讯海量技术实践干货哦~ 决策树可能会受到高度变异的影响,使得结果对所使用的特定测试数据而言变得脆弱. 根据您的测试数据样本构建多个模型(称为套袋)可以减少这种差异,但是 ...
- mac下自带的Apache+PHP环境输出错误提示
sudo vim /etc/php.ini 找到 display_errors = Off ,把Off 改为 On . 最后为 display_errors = On ; 找到 error_repor ...
- 让Python输出更漂亮
print 默认输出是换行的,如果要实现不换行需要在变量末尾加上 end="": student_age = 18 print("学生的年龄为:", stude ...
- 微信小程序初识
http://lib.csdn.net/article/wechat/46742 微信小程序的前途和定位有什么疑惑?点进去 简单先记几个印象名词:流量入口,线下是重点,“即用即走”适合低频工具类产品. ...
- Shiro报错-[org.apache.shiro.mgt.AbstractRememberMeManager] - There was a failure while trying to retrieve remembered principals.
2017-04-08 11:55:33,010 WARN [org.apache.shiro.mgt.AbstractRememberMeManager] - There was a failure ...
- Linux定时任务深入学习
为当前用户创建cron服务 1. 键入 crontab -e 编辑crontab服务文件 例如 文件内容如下: */2 * * * * /bin/sh /home/admin/jiaoben/bu ...
- 重绘(redraw或repaint),重排(reflow)
浏览器运行机制图: 浏览器的运行机制:layout:布局: 1.构建DOM树(parse):渲染引擎解析HTML文档,首先将标签转换成DOM树中的DOM node(包括js生成的标签)生成内容树(Co ...