SQL优化一例:查询条件内移,减少HASH JOIN代价

简介:

 
 
  1. 以下语句完全正确,但COST较高,原因是因为AEH、AEC、AC、ACSN几张表都有数百万条记录, 
  2. 由于采用了HASH连接,尝试采用优化索引等多种方式,但是由于记录过多,表的查询条件相对较少, 
  3. COST下降幅度始终很有限,COST提高到1000出头已经很尽力了。 
  4. Select Count(Tmp.Id) 
  5. From (Select Rownum As Id, t.Entry_Id, t.Container_Id, Con.Container_Num 
  6.              From AEC t 
  7.              Inner Join AEH Head On t.Entry_Id = Head.Entry_Id 
  8.              Inner Join AC Con On t.Container_Id = Con.Id And Head.Deleted_Flag = '0' And Con.Deleted_Flag = '0') Tmp 
  9.        Inner Join ACSN Constatus On Tmp.Container_Id = Constatus.Container_Id And 
  10.        Constatus.Px_Operation_Status <> '0'  
  11.        And Tmp.Entry_Id = :B2  
  12.        And Tmp.Container_Num = :B1 
  13.  
  14. SELECT STATEMENT, GOAL = ALL_ROWS                                Cost=3519   Cardinality=1       Bytes=62 
  15.  SORT AGGREGATE                                                 Cardinality=1       Bytes=62 
  16.   MERGE JOIN                                             Cost=3519   Cardinality=51      Bytes=3162 
  17.    TABLE ACCESS BY INDEX ROWID      Object owner=TEST   Object name=ACSN        Cost=774    Cardinality=49      Bytes=343 
  18.     INDEX FULL SCAN          Object owner=TEST   Object name=FK_A_C_C_S_P    Cost=6      Cardinality=1849     
  19.    SORT JOIN                                             Cost=2745   Cardinality=1470    Bytes=80850 
  20.     VIEW                 Object owner=TEST                    Cost=2744   Cardinality=1470    Bytes=80850 
  21.      COUNT                   
  22.       HASH JOIN                                          Cost=2744   Cardinality=1470    Bytes=94080 
  23.        NESTED LOOPS                                      Cost=1494   Cardinality=1470    Bytes=64680 
  24.         INDEX FAST FULL SCAN        Object owner=TEST   Object name=IDX_A_E_C   Cost=5      Cardinality=1470    Bytes=33810 
  25.         TABLE ACCESS BY INDEX ROWID Object owner=TEST   Object name=AEH         Cost=2      Cardinality=1       Bytes=21 
  26.          INDEX UNIQUE SCAN       Object owner=TEST   Object name=PK_AEH      Cost=1      Cardinality=1    
  27.        TABLE ACCESS FULL         Object owner=TEST   Object name=A_CO        Cost=1220   Cardinality=1005299 Bytes=20105980 
  28.  
  29.  
  30. 但再细看可以发现有如下苗头: 
  31.        And Tmp.Entry_Id = :B2  
  32.        And Tmp.Container_Num = :B1 
  33. 两个条件是等AEC、AEH、AC三个表HASH连接后才做的过滤,为啥不在连接前就对表做过滤, 
  34. 再一查在AEH表中有Entry_Id字段,而Container_Num是AC中的一个字段,于是把这两个 
  35. 条件从对TMP的外层过滤移入到AEH、AC内层过滤中,语句如下; 
  36.  
  37. Select Count(Tmp.Id) 
  38. From (Select Rownum As Id, t.Entry_Id, t.Container_Id, Con.Container_Num 
  39.              From AEC t 
  40.              Inner Join AEH Head On t.Entry_Id = Head.Entry_Id And Head.Entry_Id = :B2 --迁移条件Head.Entry_Id = :B2到此处 
  41.              Inner Join AC Con On t.Container_Id = Con.Id And Head.Deleted_Flag = '0' And Con.Deleted_Flag = '0'  
  42.              And con.Container_Num = :B1) Tmp   --迁移条件con.Container_Num = :B1到此处 
  43.        Inner Join ACSN Constatus On Tmp.Container_Id = Constatus.Container_Id And 
  44.        Constatus.Px_Operation_Status <> '0'  
  45.        --And Tmp.Entry_Id = :B2  
  46.        --And Tmp.Container_Num = :B1 
  47.  
  48. 实测结果表明,COST已经下降到了9,提升近500倍,相信这个效果是大家乐意接受的。 
  49.  
  50. SELECT STATEMENT, GOAL = ALL_ROWS                                Cost=9  Cardinality=1   Bytes=33 
  51.  SORT AGGREGATE                                              Cardinality=1   Bytes=33 
  52.   NESTED LOOPS                                           Cost=9  Cardinality=1   Bytes=33 
  53.    VIEW  Object owner=TEST                                    Cost=7  Cardinality=1   Bytes=26 
  54.     COUNT                    
  55.      NESTED LOOPS                                        Cost=7  Cardinality=1   Bytes=64 
  56.       NESTED LOOPS                                       Cost=5  Cardinality=1   Bytes=44 
  57.        TABLE ACCESS BY INDEX ROWID  Object owner=TEST   Object name=AEH          Cost=3  Cardinality=1   Bytes=21 
  58.         INDEX UNIQUE SCAN        Object owner=TEST   Object name=PK_AEH       Cost=2  Cardinality=1    
  59.        INDEX RANGE SCAN          Object owner=TEST   Object name=IDX_A_E_C       Cost=2  Cardinality=1   Bytes=23 
  60.       TABLE ACCESS BY INDEX ROWID   Object owner=TEST   Object name=AC           Cost=2  Cardinality=1   Bytes=20 
  61.        INDEX UNIQUE SCAN         Object owner=TEST   Object name=IDX_C        Cost=1  Cardinality=1    
  62.    TABLE ACCESS BY INDEX ROWID      Object owner=TEST   Object name=ACSN         Cost=2  Cardinality=1   Bytes=7 
  63.     INDEX UNIQUE SCAN            Object owner=TEST   Object name=FK_A_C_C_S_P    Cost=1  Cardinality=1    
本文转自zylhsy 51CTO博客,原文链接:http://blog.51cto.com/yunlongzheng/574394,如需转载请自行联系原作者
相关文章
|
3月前
|
SQL 监控 关系型数据库
一键开启百倍加速!RDS DuckDB 黑科技让SQL查询速度最高提升200倍
RDS MySQL DuckDB分析实例结合事务处理与实时分析能力,显著提升SQL查询性能,最高可达200倍,兼容MySQL语法,无需额外学习成本。
|
3月前
|
SQL 存储 关系型数据库
MySQL体系结构详解:一条SQL查询的旅程
本文深入解析MySQL内部架构,从SQL查询的执行流程到性能优化技巧,涵盖连接建立、查询处理、执行阶段及存储引擎工作机制,帮助开发者理解MySQL运行原理并提升数据库性能。
|
2月前
|
SQL 存储 监控
SQL日志优化策略:提升数据库日志记录效率
通过以上方法结合起来运行调整方案, 可以显著地提升SQL环境下面向各种搜索引擎服务平台所需要满足标准条件下之数据库登记作业流程综合表现; 同时还能确保系统稳健运行并满越用户体验预期目标.
187 6
|
3月前
|
SQL 监控 关系型数据库
SQL优化技巧:让MySQL查询快人一步
本文深入解析了MySQL查询优化的核心技巧,涵盖索引设计、查询重写、分页优化、批量操作、数据类型优化及性能监控等方面,帮助开发者显著提升数据库性能,解决慢查询问题,适用于高并发与大数据场景。
|
2月前
|
SQL 关系型数据库 MySQL
(SQL)SQL语言中的查询语句整理
查询语句在sql中占了挺大一部分篇幅,因为在数据库中使用查询语句的次数远多于更新与删除命令。而查询语句比起其他语句要更加的复杂,可因为sql是数据库不可或缺的一部分,所以即使不懂,也必须得弄懂,以上。
219 0
|
4月前
|
SQL XML Java
通过MyBatis的XML配置实现灵活的动态SQL查询
总结而言,通过MyBatis的XML配置实现灵活的动态SQL查询,可以让开发者以声明式的方式构建SQL语句,既保证了SQL操作的灵活性,又简化了代码的复杂度。这种方式可以显著提高数据库操作的效率和代码的可维护性。
285 18
|
4月前
|
SQL 人工智能 数据库
【三桥君】如何正确使用SQL查询语句:避免常见错误?
三桥君解析了SQL查询中的常见错误和正确用法。AI产品专家三桥君通过三个典型案例:1)属性重复比较错误,应使用IN而非AND;2)WHERE子句中非法使用聚合函数的错误,应改用HAVING;3)正确的分组查询示例。三桥君还介绍了学生、课程和选课三个关系模式,并分析了SQL查询中的属性比较、聚合函数使用和分组查询等关键概念。最后通过实战练习帮助读者巩固知识,强调掌握这些技巧对提升数据库查询效率的重要性。
148 0
|
7月前
|
SQL 关系型数据库 MySQL
凌晨2点报警群炸了:一条sql 执行200秒!搞定之后,我总结了一个慢SQL查询、定位分析解决的完整套路
凌晨2点报警群炸了:一条sql 执行200秒!搞定之后,我总结了一个慢SQL查询、定位分析解决的完整套路
凌晨2点报警群炸了:一条sql 执行200秒!搞定之后,我总结了一个慢SQL查询、定位分析解决的完整套路
|
5月前
|
SQL
SQL中如何删除指定查询出来的数据
SQL中如何删除指定查询出来的数据
|
7月前
|
SQL 存储 自然语言处理
SQL的解析和优化的原理:一条sql 执行过程是什么?
SQL的解析和优化的原理:一条sql 执行过程是什么?
SQL的解析和优化的原理:一条sql 执行过程是什么?