试图了解使用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;
答案 0 :(得分:1)
如果愿意,您可以为此进行测试,但是逻辑表明,不平等方法应该更快。 (您只能通过测试才能找到更快的速度。)
为什么?
因为不平等是一个检验。相比之下,x in (3, 4, 5, 6, 7)
是五个测试,如果x = 7
或x
不在列表中,则必须依次尝试所有五个。 in
条件被重写为x = 3 or x = 4 or x = 5 ...
,并且这些测试不能并行运行-一次检查一次。