【问题标题】:Case when Statement affect the Performance.语句影响性能的情况。
【发布时间】:2012-10-05 03:32:12
【问题描述】:

1- 在 Where 条件内部或外部影响性能时执行 Case,影响单个查询的查询计划,影响单个查询使用的索引的选取。

2- 最好编写 2 个或多个查询,每个查询处理一个 Case when 值的选项,而不是编写一个具有 case when 语句的单个查询。

例子:

 Select  Acc ,
 Case 
 when  Calculation_type  = 'M' then Min_value 
 when  Calculation_type  = 'E' then Ending_value
 Else 
 Average_BLC
 END
From Table 

另类

Select Acc ,    Min_value 
From Table 
where   Calculation_type  = 'M'
union all 
Select  Acc , Ending_value        
From Table 
where  Calculation_type  = 'E'
union all 
Select   Acc , Average_BLC       
From Table 
where Calculation_type  = 'A'

【问题讨论】:

    标签: database oracle sybase


    【解决方案1】:

    在这种情况下,第一个选项几乎肯定会更有效,因为它只要求您点击表(和/或表上的索引)一次而不是点击三次(我假设您打算第一个查询有一个WHERE calculation_type IN ('A', 'E', 'M'),以便结果与第二个查询匹配)。

    我想如果你有三个不同的覆盖索引,一个用于你UNION ALL-ing 在一起的每个查询,并且优化器使用这些索引是有意义的,可能差别不大。

    假设您必须为其中的一些列点击表,但是,您希望能够读取表行一次并获取所有列值,而不是为三个不同的子查询读取块三个不同的时间。

    【讨论】:

    • 好吧,让我们忘记联合所有情况都是 3 个不同的查询比一个查询更好的选择,尤其是在处理巨大的数据大小时,从我的角度来看,3 个经过调整的查询比一个查询更好地获取索引全面扫描。
    • @Tarek - 好吧,忽略存在三个不同查询的事实会忽略查询之间最根本的区别。也就是说,当您的谓词为 WHERE calculation_type IN ('A', 'E', 'M') 时,没有什么能阻止 Oracle 使用索引,因此没有特别的理由期望一个版本与其他版本相比特别“调整”。正如我所说,如果您为三个单独的查询设置了三个不同的覆盖索引,您可能会遇到UNION ALL 有意义但极不寻常的情况。
    猜你喜欢
    • 2015-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-15
    • 2018-01-06
    • 1970-01-01
    • 2019-05-02
    • 1970-01-01
    相关资源
    最近更新 更多