各个操作数的顺序会影响SQL表达式是否可保留吗?

时间:2019-03-25 17:50:07

标签: sql sql-server

我的一位精通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

出于可保存性的考虑。我发现查询计划没有什么不同,尽管最终我还是为了遵守团队编码标准进行了更改。在某些情况下,我的同事所说的是正确的吗?表达式中操作数的顺序是否对其执行时间有潜在影响?这与我理解可工作性的方式格格不入。

2 个答案:

答案 0 :(得分:1)

对于Postgres,答案肯定是:“不。” (后来添加了。)

只要定义了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或

现在,回到您的情况。
您的问题很简单。您有X,也有Y。X> Y或Y

P.S。当然,我承认,可能存在优化器非常差的数据库,这种类型的伪造可以发挥作用。但是,正如我之前所说,在现代数据库中,您不必为此担心。