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,如需转载请自行联系原作者
相关文章
|
8天前
|
SQL NoSQL Java
Java使用sql查询mongodb
通过使用 MongoDB Connector for BI 和 JDBC,开发者可以在 Java 中使用 SQL 语法查询 MongoDB 数据库。这种方法对于熟悉 SQL 的团队非常有帮助,能够快速实现对 MongoDB 数据的操作。同时,也需要注意到这种方法的性能和功能限制,根据具体应用场景进行选择和优化。
33 9
|
29天前
|
SQL 存储 人工智能
Vanna:开源 AI 检索生成框架,自动生成精确的 SQL 查询
Vanna 是一个开源的 Python RAG(Retrieval-Augmented Generation)框架,能够基于大型语言模型(LLMs)为数据库生成精确的 SQL 查询。Vanna 支持多种 LLMs、向量数据库和 SQL 数据库,提供高准确性查询,同时确保数据库内容安全私密,不外泄。
102 7
Vanna:开源 AI 检索生成框架,自动生成精确的 SQL 查询
|
14天前
|
SQL Oracle 数据库
使用访问指导(SQL Access Advisor)优化数据库业务负载
本文介绍了Oracle的SQL访问指导(SQL Access Advisor)的应用场景及其使用方法。访问指导通过分析给定的工作负载,提供索引、物化视图和分区等方面的优化建议,帮助DBA提升数据库性能。具体步骤包括创建访问指导任务、创建工作负载、连接工作负载至访问指导、设置任务参数、运行访问指导、查看和应用优化建议。访问指导不仅针对单条SQL语句,还能综合考虑多条SQL语句的优化效果,为DBA提供全面的决策支持。
44 11
|
2月前
|
SQL 缓存 监控
大厂面试高频:4 大性能优化策略(数据库、SQL、JVM等)
本文详细解析了数据库、缓存、异步处理和Web性能优化四大策略,系统性能优化必知必备,大厂面试高频。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:4 大性能优化策略(数据库、SQL、JVM等)
|
2月前
|
SQL Java
使用java在未知表字段情况下通过sql查询信息
使用java在未知表字段情况下通过sql查询信息
39 8
|
2月前
|
SQL 缓存 数据库
SQL慢查询优化策略
在数据库管理和应用开发中,SQL查询的性能优化至关重要。慢查询优化不仅可以提高应用的响应速度,还能降低服务器负载,提升用户体验。本文将详细介绍针对SQL慢查询的优化策略。
|
2月前
|
SQL 存储 BI
gbase 8a 数据库 SQL合并类优化——不同数据统计周期合并为一条SQL语句
gbase 8a 数据库 SQL合并类优化——不同数据统计周期合并为一条SQL语句
|
2月前
|
SQL 数据库
gbase 8a 数据库 SQL优化案例-关联顺序优化
gbase 8a 数据库 SQL优化案例-关联顺序优化
|
2月前
|
SQL 数据库 UED
SQL性能提升秘籍:5步优化法与10个实战案例
在数据库管理和应用开发中,SQL查询的性能优化至关重要。高效的SQL查询不仅可以提高应用的响应速度,还能降低服务器负载,提升用户体验。本文将分享SQL优化的五大步骤和十个实战案例,帮助构建高效、稳定的数据库应用。
75 3
|
2月前
|
SQL 安全 PHP
PHP开发中防止SQL注入的方法,包括使用参数化查询、对用户输入进行过滤和验证、使用安全的框架和库等,旨在帮助开发者有效应对SQL注入这一常见安全威胁,保障应用安全
本文深入探讨了PHP开发中防止SQL注入的方法,包括使用参数化查询、对用户输入进行过滤和验证、使用安全的框架和库等,旨在帮助开发者有效应对SQL注入这一常见安全威胁,保障应用安全。
63 4