我的一位精通SQL的同事告诉我,>或=表达式中操作数的顺序可以确定表达式是否可精化。特别是,对于一个查询,其case语句包括:
CASE
when (select count(i.id)
from inventory i
inner join orders o on o.idinventory = i.idInventory
where o.idOrder = @order) > 1 THEN 2
ELSE 1
并被告知将操作数的顺序反转为等效
CASE
when 1 < (select count(i.id)
from inventory i
inner join orders o on o.idinventory = i.idInventory
where o.idOrder = @order) THEN 2
ELSE 1
出于可保存性的考虑。我发现查询计划没有什么不同,尽管最终我还是为了遵守团队编码标准进行了更改。在某些情况下,我的同事所说的是正确的吗?表达式中操作数的顺序是否对其执行时间有潜在影响?这与我理解可工作性的方式格格不入。
答案 0 :(得分:1)
对于Postgres,答案肯定是:“不。” (后来添加了sql-server。)
只要定义了COMMUTATOR
,查询计划者就可以在运算符的左右操作数之间翻转,对于<
和>
的所有实例都是如此。 (运算符实际上是由运算符本身及其接受的操作数定义的。)查询计划程序将这样做以使表达式“可更改”。相关答案及详细说明:
对于其他没有COMMUTATOR
的运算符,这是不同的。 ~~
(LIKE
)的示例:
答案 1 :(得分:1)
如果您谈论的是最流行的现代数据库,例如Microsoft SQL,Oracle,Postgres,MySql,Teradata,答案肯定是否。
什么是SARGable查询?
SARGable查询是努力缩小数据库为返回预期结果而必须处理的行数的查询。我的意思是,例如:
考虑此查询:
select * from table where column1 <> 'some_value';
很明显,在这种情况下使用索引是没有用的,因为数据库肯定会必须遍历表中的所有行才能为您提供预期的行。
但是如果我们改变运算符怎么办?
select * from table where column1 = 'some_value';
在这种情况下,索引可以提供良好的性能并几乎在瞬间返回预期的行。
SARGable运算符为: =,<,>,<=,> =,LIKE(无%),介于
非SARG运算符是: <>,IN或
现在,回到您的情况。 P.S。当然,我承认,可能存在优化器非常差的数据库,这种类型的伪造可以发挥作用。但是,正如我之前所说,在现代数据库中,您不必为此担心。
您的问题很简单。您有X,也有Y。X> Y或Y