一条相关子查询的SQL优化
来源:互联网 发布:广联达装修预算软件 编辑:程序博客网 时间:2024/05/18 03:15
原sql如下:
select distinct gc.program, gc.agent_id, gc.freq, gc.programid, a.agentName, (select count(id) from ge_t where alert_type='add' and agent_id = gc.agent_id and freq = gc.freq and programid = gc.programid ) as addNum, (select count(id) from ge_t where alert_type='del' and agent_id = gc.agent_id and freq = gc.freq and programid = gc.programid ) as reduceNum, (select count(id) from ge_t where alert_type='change' and agent_id = gc.agent_id and freq = gc.freq and programid = gc.programid ) as changeNum, to_char(ge.date_up,'%Y-%m-%d') as data_upfrom gc_t gcleft join ge_t geon gc.agent_id = ge.agent_id and gc.freq = ge.freq and gc.programid = ge.programidleft join ga_t aon a.agentid = gc.agent_id
该sql的问题是在select子查询中的count汇总,和from中的表进行关联,如下:
(select count(id) from ge_t where alert_type='add' and agent_id = gc.agent_id and freq = gc.freq and programid = gc.programid ) as addNum
这种写法数据库会对表的每一行做1次关联汇总,非常的耗时,建议改写如下:
首先,根据条件将子查询的部分改写成case when语句,置为1或0,如下:
select gc.program, gc.agent_id, gc.freq, gc.programid, a.agentName, case when alert_type='add' then 1 else 0 end as addNum, case when alert_type='del' then 1 else 0 end as reduceNum, case when alert_type='change' then 1 else 0 end as changeNum, to_char(ge.date_up,'%Y-%m-%d')as data_upfrom gc_t gcleft join ge_t geon gc.agent_id = ge.agent_id and gc.freq = ge.freqand gc.programid = ge.programidleft join ga_t aon a.agentid = gc.agent_id
然后,对case when的列进行sum汇总,最终改写的sql如下:
select program,agent_id,freq,programid,agentName, sum(addNum) as addNum, sum(reduceNum) as reduceNum,sum(changeNum) as changeNum, data_upfrom ( select gc.program, gc.agent_id, gc.freq, gc.programid, a.agentName, case when alert_type='add' then 1 else 0 end as addNum, case when alert_type='del' then 1 else 0 end as reduceNum, case when alert_type='change' then 1 else 0 end as changeNum, to_char(ge.date_up,'%Y-%m-%d')as data_upfrom gc_t gcleft join ge_t geon gc.agent_id = ge.agent_id and gc.freq = ge.freqand gc.programid = ge.programidleft join ga_t aon a.agentid = gc.agent_id) tgroup by program,agent_id,freq,programid,agentName,data_up
阅读全文
0 0
- 一条相关子查询的SQL优化
- 记一条子查询的SQL优化
- 相关子查询优化
- MySQL SQL优化案例:相关子查询(dependent subquery)优化
- 相关子查询 - SQL
- sql 子查询优化
- SQL优化-标量子查询的改写
- 如何优化SQL查询当前数据上一条和下一条的记录?
- SQL入门:相关子查询
- SQL 相关子查询例子
- SQL基础--子查询相关
- 帮盖尔优化SQL-----子查询优化的经典案例
- 【SQL优化】子查询展开
- 包含子查询的一条insert语句
- sql非相关子查询与相关子查询
- 相关子查询与不相关子查询的优化(一)
- 相关子查询与不相关子查询的优化(二)
- 相关子查询与不相关子查询的优化(三)
- java分页详解
- QListWidget中项的灰显设置
- 【grunt】两小时入门
- 函数传值的三种方法
- 为什么 Python 不支持函数重载?
- 一条相关子查询的SQL优化
- Java ClassPath环境变量详解
- SSM中静态资源配置
- String、StringBuffer与StringBulider之间的区别
- 9.12
- 《Windows核心编程》の托盘程序的编写(CSystemTray类)
- Tensorflow中计算图机制和常用函数笔记
- 各种依赖
- CSS——EM详细功能介绍