具有多个值且小于或等于大于的IN子句之间的性能

时间:2019-03-26 21:09:02

标签: sql oracle oracle11g

试图了解使用case语句的性能含义,该case语句包含一个包含多个值的IN子句(下面的查询1)与一个小于逻辑运算符的单个子句(下面的查询2)。 IN子句是否必须对给定的字段执行多个逻辑检查?例如,假设某行不满足第一个查询等于1的条件,那么下一条记录是否必须检查其first_rating_number字段为2,然后为3,然后如果没有,则为4?这会比first_rating_number <5慢吗(就像第二个查询一样)?

我运行了一个执行计划,Oracle告诉我该开销是相等的,并且第二个查询中的字节略高。这对我来说没有意义。在此先感谢所有。

Edit-其他信息:昨天,我收到的字节数有所不同,第一个查询显示的字节数较少。今天,这两个计划都显示相同的“解释计划”信息。

行数:1,261,914

查询1说明计划:费用-22,134;字节-3,785,742

查询2说明计划:费用-22,134;字节-3,785,742

SELECT 
  CASE  WHEN first_rating_number = 1 THEN 'AAA' 
         WHEN first_rating_number IN (2,3,4) THEN 'AA' 
         WHEN first_rating_number IN (5,6,7) THEN 'A' 
         WHEN first_rating_number IN (8,9,10) THEN 'BBB' 
         WHEN first_rating_number IN (11,12,13) THEN 'BB'
         WHEN first_rating_number IN (14,15,16) THEN 'B'
         WHEN first_rating_number IN (17,18,19) THEN 'CCC'        
         WHEN first_rating_number IN (20) THEN 'CC'                     
         WHEN first_rating_number IN (22) THEN 'D'  END first_rating_category_test
  FROM tbl_IN_CLAUSE;

SELECT 
  CASE  WHEN first_rating_number = 1 THEN 'AAA' 
         WHEN first_rating_number <5 THEN 'AA' 
         WHEN first_rating_number <8 THEN 'A' 
         WHEN first_rating_number <11 THEN 'BBB' 
         WHEN first_rating_number <14 THEN 'BB'
         WHEN first_rating_number <17 THEN 'B'
         WHEN first_rating_number <20 THEN 'CCC'        
         WHEN first_rating_number = 20 THEN 'CC'                     
         WHEN first_rating_number = 22 THEN 'D'  END first_rating_category_test
  FROM tbl_LESS_THAN;  

1 个答案:

答案 0 :(得分:1)

如果愿意,您可以为此进行测试,但是逻辑表明,不平等方法应该更快。 (您只能通过测试才能找到更快的速度。)

为什么?

因为不平等是一个检验。相比之下,x in (3, 4, 5, 6, 7)是五个测试,如果x = 7x不在列表中,则必须依次尝试所有五个。 in条件被重写为x = 3 or x = 4 or x = 5 ...,并且这些测试不能并行运行-一次检查一次。