繁体   English   中英

此查询的Oracle查询优化

[英]Oracle Query optimization for this query

请在下面的查询/索引中提出改进建议,以获得更快的结果。

询问

SELECT Tab1.pk, Tab1.c_RetryCount, Tab1.c_TimeCreated  
  FROM Table1 Tab1  
 WHERE ( ( Tab1.c_node = :1 
           OR Tab1.c_node IS NULL ) 
       AND ( ( Tab1.c_RetryCount < :2 
               AND Tab1.c_TimeUpdated < :3 ) 
            OR Tab1.c_RetryCount < :4 ) 
       AND Tab1.c_SentStatus = :5 ) 
   AND ( Tab1.c_Active = 1 ) 
   AND ( Tab1.c_DelFlag = 0 ) 
   AND ( Tab1.c_Shard = :6 )  
 ORDER BY Tab1.c_RetryCount ASC, Tab1.c_TimeCreated ASC

计划哈希值:2132878353


| Id  | Operation                     | Name            | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT              |                 |       |       |     4 (100)|          |
|   1 |  SORT ORDER BY                |                 |    43 |  2279 |     4  (25)| 00:00:01 |
|   2 |   CONCATENATION               |                 |       |       |            |          |
|*  3 |    TABLE ACCESS BY INDEX ROWID| Table1          |     1 |    53 |     1   (0)| 00:00:01 |
|*  4 |     INDEX RANGE SCAN          | I_VOY52S_H881K4 |     1 |       |     1   (0)| 00:00:01 |
|*  5 |    TABLE ACCESS BY INDEX ROWID| Table1          |    42 |  2226 |     2   (0)| 00:00:01 |
|*  6 |     INDEX RANGE SCAN          | I_VOY52S_H881K4 |     2 |       |     2   (0)| 00:00:01 |
-------------------------------------------------------------------------------------------------

谓词信息(由操作ID标识):


   3 - filter(("Tab1"."c_DelFlag"=0 AND "Tab1"."c_ACTIVE"=1))
   4 - access("Tab1"."c_Shard"=:6 AND "Tab1"."c_node" IS NULL 
              AND "Tab1"."c_SENTSTATUS"=:5)
       filter(("Tab1"."c_SENTSTATUS"=:5 AND ("Tab1"."c_RETRYCOUNT"<:4 OR 
              ("Tab1"."c_TIMEUPDATED"<:3 AND "Tab1"."c_RETRYCOUNT"<:2))))
   5 - filter(("Tab1"."c_DelFlag"=0 AND "Tab1"."c_ACTIVE"=1))
   6 - access("Tab1"."c_Shard"=:6 AND "Tab1"."c_node"=:1 AND 
              "Tab1"."c_SENTSTATUS"=:5)
       filter(("Tab1"."c_SENTSTATUS"=:5 AND ("Tab1"."c_RETRYCOUNT"<:4 OR 
              ("Tab1"."c_TIMEUPDATED"<:3 AND "Tab1"."c_RETRYCOUNT"<:2)) AND 
              LNNVL("Tab1"."c_node" IS NULL)))

表Table1的索引:

  I_VOY52S_19HS9Y5 (c_SENTSTATUS, c_ACTIVE, c_DelFlag) 
  I_VOY52S_1CPSX8O (c_node) 
  I_VOY52S_H881K4 (c_Shard, c_node, c_RETRYCOUNT, c_TIMEUPDATED, c_SENTSTATUS) 
  P_VOY52S_142KZ99 (pk) 

除了c_Shard之外,应用于每行的其他两个单值过滤器使用c_Active,c_DelFlag。 因此,可以很好地猜测将它们添加到I_VOY52S_H881K4索引将提高此查询的性能。

或者,一个新的索引:

    I_VOY52S_XXXXX (c_Shard, c_Active, c_DelFlag, 
                    c_node, c_RETRYCOUNT, c_TIMEUPDATED, c_SENTSTATUS) 

您甚至可以在末尾添加pk和c_timeCreated,以保持查询仅索引。

当然,当考虑其他查询或数据量时,创建这样的新索引可能是完全不切实际的。 但是,由于您没有提到这一点,因此我假设使用零成本的另一个索引非常适合此查询。

因此,您将获得:

    I_VOY52S_XXXXX (c_Shard, c_Active, c_DelFlag, 
                    c_node, c_RETRYCOUNT, c_TIMEUPDATED, c_SENTSTATUS, 
                    c_timecreated, pk) 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM