Database 语句影响性能时的大小写。

Database 语句影响性能时的大小写。,database,oracle,sybase,Database,Oracle,Sybase,1-当Where条件内部或外部影响性能时,是否会影响单个查询的查询计划,是否会影响用于单个查询的索引的选取 2-最好编写两个或多个查询,每个查询处理Case-when值的一个选项,而不是编写一个具有Case-when语句的查询 例如: Select Acc , Case when Calculation_type = 'M' then Min_value when Calculation_type = 'E' then Ending_value Else Averag

1-当Where条件内部或外部影响性能时,是否会影响单个查询的查询计划,是否会影响用于单个查询的索引的选取

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'

在这种情况下,第一个选项几乎肯定会更有效,因为它只要求您点击表(和/或表上的索引)一次,而不是三次(我假设您希望第一个查询有一个
WHERE calculation\u输入('a','E','m'))
以便结果与第二个查询匹配)

我假设,如果您有三个不同的覆盖索引,每个查询一个,您要将所有查询联合在一起,并且优化器使用这些索引是有意义的,那么可能差别不大


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

Ok,让我们忘记Union all的情况:三个不同的查询比一个查询更好,特别是在处理大数据量时,从我的观点来看,3个优化的查询使用索引比一个查询进行完整扫描要好。@Tarek-好吧,忽略三个不同的查询忽略了查询之间最根本的区别。也就是说,当您的谓词是
WHERE calculation\u type IN('A','E','M')
时,没有什么可以阻止Oracle使用索引,因此没有特别的理由期望一个版本与其他版本相比进行特别的“调优”。如我所说,如果三个单独的查询有三个不同的覆盖索引,那么可能会出现一种情况,
UNION-ALL
是有意义的,但这是极不寻常的。