`

关于 where条件下加了子查询 导致速度巨慢的解决方案

 
阅读更多

问题源自一个sql代码

select 
  count(1) "rwsl",
  count(decode(xx.FPSJ,null,null,1)) "fpsl",
  count(decode(xx.HSSJ,null,null,1)) "fksl",
  count(decode(mx.NEXT_CLHJ,'HSJGCH',1,null)) "hsjgch",
  count(decode(mx.NEXT_CLHJ,'HSJGFH',1,null)) "hsjgfh",
  count(decode(mx.NEXT_CLHJ,'FKJGCH',1,null)) "fkjgch",
  count(decode(mx.NEXT_CLHJ,'FKJGFH',1,null)) "fkjgfh",
  count(decode(mx.NEXT_CLHJ,'FKJGQR',1,null)) "fkjgqr",
  count(decode(mx.NEXT_CLHJ||'!'||mx.LAST_CLZT_DM,'FKJGSP!YQRFKJG',1,null)) "fkjgsp",
  count(decode(mx.xfzt||'!'||mx.LAST_CLZT_DM,'YXF!QRBJS',1,
    'YXF!RWJS',1,'YXF!ECHS',1,null)) "fkspjs",
  count(decode(mx.LAST_CLZT_DM,'QRBJS',1,null)) "qrbjs",
  count(decode(mx.xfzt||'!'||mx.LAST_CLZT_DM,'YXF!RWJS',1,null)) "rwjs",
  count(decode(mx.LAST_CLZT_DM,'ECHS',1,null)) "thhs"
  from  FXYD_YDMX mx,fxyd_rwpc pc,fxyd_clxx xx,dim_swjg swjg 
where mx.ydjg_dm = swjg.swjg_dm
  and swjg.SWJG_DSSWJG_DM = '23403000000'
  and mx.tzs_bh = pc.tzs_bh 
  and mx.fxmx_bh = xx.fxmx_bh(+)
  and pc.TJBZ = 'Y'
--注意下面就是慢的罪魁祸首
              and ((select count(1) from FXYD_RWHDJL h where h.clhj='FKJGSP' and h.zt_clh = 'ECHS' and h.fxmx_bh = mx.fxmx_bh) >= 0) 

 由于where条件后面加了一个子查询 还用到了 聚合函数count 以及数据的比较

导致了oracle将执行计划 强制走了 主表的全表扫描 从而导致执行时间查过了40秒

 

解决方案是 改成

--用历史表先处理好数据 在跟主表去关联过滤
with 
hdtemp as (select h.fxmx_bh  from FXYD_RWHDJL h group by h.fxmx_bh having(count(decode(h.clhj||'#'||h.zt_clh,'FKJGSP#ECHS',1,null)))>=0) 
select 
  count(1) "rwsl",
  count(decode(xx.FPSJ,null,null,1)) "fpsl",
  count(decode(xx.HSSJ,null,null,1)) "fksl",
  count(decode(mx.NEXT_CLHJ,'HSJGCH',1,null)) "hsjgch",
  count(decode(mx.NEXT_CLHJ,'HSJGFH',1,null)) "hsjgfh",
  count(decode(mx.NEXT_CLHJ,'FKJGCH',1,null)) "fkjgch",
  count(decode(mx.NEXT_CLHJ,'FKJGFH',1,null)) "fkjgfh",
  count(decode(mx.NEXT_CLHJ,'FKJGQR',1,null)) "fkjgqr",
  count(decode(mx.NEXT_CLHJ||'!'||mx.LAST_CLZT_DM,'FKJGSP!YQRFKJG',1,null)) "fkjgsp",
  count(decode(mx.xfzt||'!'||mx.LAST_CLZT_DM,'YXF!QRBJS',1,
    'YXF!RWJS',1,'YXF!ECHS',1,null)) "fkspjs",
  count(decode(mx.LAST_CLZT_DM,'QRBJS',1,null)) "qrbjs",
  count(decode(mx.xfzt||'!'||mx.LAST_CLZT_DM,'YXF!RWJS',1,null)) "rwjs",
  count(decode(mx.LAST_CLZT_DM,'ECHS',1,null)) "thhs"
  from  FXYD_YDMX mx,fxyd_rwpc pc,fxyd_clxx xx,dim_swjg swjg,hdtemp 
where mx.ydjg_dm = swjg.swjg_dm
  and swjg.SWJG_DSSWJG_DM = '23403000000'
  and hdtemp.FXMX_BH = mx.fxmx_bh
  and mx.tzs_bh = pc.tzs_bh 
  and mx.fxmx_bh = xx.fxmx_bh(+)
  and pc.TJBZ = 'Y'

 

分享到:
评论

相关推荐

    pageHelper分页失效解决方案.docx

    pageHelper 分页失效解决方案 PageHelper 是一款优秀的 MyBatis 分页插件,它可以非常便利的使用,使开发效率得到很大的提升。但是,在使用 PageHelper 进行分页查询时,会出现一些问题,例如当进行一对多结果映射...

    多级部门查询性能问题解决方案.docx

    group_concat 函数在处理大量数据时效率较低,因为它会将所有结果集合并成一个字符串,对于大数据量的子部门查询,这种做法会导致内存消耗过大,进而影响查询速度。 解决方案: 1. 优化 MySQL 函数递归调用方案: ...

    dblink_clob字段异常解决方案

    dblink_clob字段异常解决方案 在数据库.link连接远程数据库时,经常会遇到无法使用CLOB字段的问题,这是因为CLOB字段在远程数据库中的处理方式与本地数据库不同所导致的。下面将讨论解决dblink_clob字段异常的解决...

    sql 查询慢的48个原因分析.txt

    - 分解复杂查询为更简单的子查询或使用视图。 - 避免在WHERE子句中使用函数或表达式,这可能会阻止使用索引。 #### 11. 服务器配置不当 - **问题**:服务器硬件配置不合理,例如CPU数量、内存大小等不匹配。 - **...

    hibernate子查询

    尽管这个问题在Hibernate用户中并不罕见,但遗憾的是,相关的解决方案在论坛或文档中并不常见。 为了解决这个问题,我们需要寻找替代策略。一种可能的方法是创建视图,但这会增加数据库层面的复杂性。另一种方法是...

    MySQL子查询用法实例分析

    此外,还可以通过`EXISTS`或`NOT EXISTS`来检查子查询是否存在满足条件的记录。 为了进一步提高查询效率,可以考虑以下优化策略: 1. 使用索引:确保对参与比较和分组的列创建了索引,这将显著提高数据检索速度。 2...

    百万数据级快速查询优化技巧

    - 如果需要频繁使用某一子查询的结果,考虑创建一个临时表来存储结果,而不是每次查询都重新计算。 #### 13. 索引优化 - 考虑索引类型和顺序,Clustered索引对查询和数据输入顺序有重大影响。如果查询模式和数据...

    MySQL数据库update更新子查询

    本篇将深入探讨如何在`UPDATE`语句中正确使用子查询,并提供相关的解决方案。 首先,我们要明白在`UPDATE`语句中直接使用子查询可能引发的问题。例如,当我们尝试像这样更新数据: ```sql UPDATE test.tb_vobile a...

    Mysql子查询IN中使用LIMIT应用示例

    但是,MySQL并不支持在`IN`、`ALL`、`ANY`或`SOME`子查询中直接使用`LIMIT`,导致了错误。 为了解决这个问题,开发者采取了另一种策略,即创建一个临时子查询来获取所需的`aid`值: ```sql WHERE mapply.aid IN ...

    浅谈mysql的子查询联合与in的效率

    本文主要探讨了子查询与`IN`操作符在高并发场景下的性能差异,并提供了一个实际案例来说明如何通过调整查询结构来提升性能。以下是对相关知识点的详细说明: 1. **子查询与`IN`操作符**: `IN`操作符常用于在`...

    ROWNUM的使用技巧

    为了避免这些问题,我们可以使用子查询和 ROWNUM 结合来实现 Top N 结果输出。例如: ```sql select * from ( select a.*, rownum as rn from ( select * from css_bl_view a where capture_phone_num = ...

    Oracle公司内部数据库培训资料Les06chinese.ppt

    4. **子查询的位置**:子查询通常出现在WHERE或HAVING子句中,但需注意,子查询必须包含在括号内,且一般应放在比较条件的右侧。 5. **子查询与组函数的结合**:子查询可以与MIN, MAX, SUM等组函数一起使用,如找出...

    一次MySQL两千万数据大表的优化过程,三种解决方案.docx

    3. **使用JOIN代替子查询**:通过JOIN来合并多个表的数据,而不是使用子查询。 4. **拆分大型的DELETE或INSERT语句**:将大型的删除或插入操作拆分为多个较小的操作,以减少锁定时间和资源消耗。 5. **启用慢查询...

    提高数据库性能的解决方案

    这种方法称为"子查询外提"或"计算前置",是数据库性能优化的常用手段之一。 此外,对于大量数据的处理,可以考虑使用索引、分区等技术来提升查询速度。在这个例子中,如果`ipdb`表的`start_ip`和`end_ip`字段已建立...

    11012.rar

    - 要注意性能优化,过多的表关联可能导致查询速度变慢,适时创建索引和调整查询结构有助于提高效率。 3. **子查询(Subquery)**: - 子查询是在一个更大的查询内部使用的查询,它可以作为一个独立的查询运行并...

    海量数据库的查询优化及分页算法方案

    3. **子查询与游标**:对于旧版本的SQL Server,可以通过子查询配合游标实现分页,但这通常效率较低,不推荐在大数据量场景下使用。 4. **物理分页与逻辑分页**:物理分页基于数据存储位置,而逻辑分页根据特定条件...

    MySQL中使用case when 语句实现多条件查询的方法

    尽管这种方法可以工作,但它可能不是最优的解决方案,因为它会导致多次扫描表。对于性能优化,可以考虑使用其他方法,如使用`UNION ALL`或者通过在`WHERE`子句中直接组合多个条件。 然而,对于特定的场景,如数据量...

    K3数据库索引及系统性能优化解决方案(具体应用篇).docx

    ### K3数据库索引及系统性能优化解决方案(具体应用篇) #### 一、引言 在当前的大数据时代,数据库的性能直接影响到整个系统的运行效率和用户体验。对于企业级应用而言,如何通过合理的设计和优化手段提升数据库...

    Oracle查询优化技巧与案例 .pdf

    解决方案是在WHERE子句中涉及的列上创建合适的索引。 **案例2:减少全表扫描** 如果某个查询经常导致全表扫描,可以通过添加适当的过滤条件来减少扫描范围,或者创建适当的索引来加速查询。 **案例3:利用分区...

    mysql关联子查询的一种优化方法分析

    当涉及到大型数据表时,关联子查询可能导致显著的延迟。本文将深入探讨MySQL关联子查询的优化方法,通过实例来展示如何改进查询效率。 关联子查询,也称为嵌套查询,是将一个查询的结果作为另一个查询的条件。在...

Global site tag (gtag.js) - Google Analytics