Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server如何计算逻辑表达式?_Sql_Sql Server_Query Optimization - Fatal编程技术网

SQL Server如何计算逻辑表达式?

SQL Server如何计算逻辑表达式?,sql,sql-server,query-optimization,Sql,Sql Server,Query Optimization,我正在编写一个有点复杂的sql查询,恐怕执行起来会很繁重。所以我想知道MS SQL Server是如何解决一些问题的 若有像ex1和ex2这样的逻辑表达式,服务器是否总是对它们求值?它是否总是先评估ex1,然后评估ex2(如果需要)? 它是指定的吗?我可以信赖吗?您所指的是简单的评估。而且,是的,如果SQL Server正在计算表达式,并且它计算的第一个表达式为false,那么它不(一定)计算第二个表达式 在这方面有一些警告。首先,您无法知道哪个SQL Server选择首先进行评估。如果一个便宜

我正在编写一个有点复杂的sql查询,恐怕执行起来会很繁重。所以我想知道MS SQL Server是如何解决一些问题的

若有像ex1和ex2这样的逻辑表达式,服务器是否总是对它们求值?它是否总是先评估ex1,然后评估ex2(如果需要)?
它是指定的吗?我可以信赖吗?

您所指的是简单的评估。而且,是的,如果SQL Server正在计算表达式,并且它计算的第一个表达式为false,那么它不(一定)计算第二个表达式

在这方面有一些警告。首先,您无法知道哪个SQL Server选择首先进行评估。如果一个便宜,另一个昂贵(比如用户定义的函数),那么可以使用
case
表达式控制执行顺序


第二,表达式的求值通常不是查询所需的时间。读取数据并为联接和聚合匹配行通常是查询中耗时的部分。因此,关注微观优化可能对提高性能没有多大帮助。

您所指的是捷径评估。而且,是的,如果SQL Server正在计算表达式,并且它计算的第一个表达式为false,那么它不(一定)计算第二个表达式

在这方面有一些警告。首先,您无法知道哪个SQL Server选择首先进行评估。如果一个便宜,另一个昂贵(比如用户定义的函数),那么可以使用
case
表达式控制执行顺序


第二,表达式的求值通常不是查询所需的时间。读取数据并为联接和聚合匹配行通常是查询中耗时的部分。因此,专注于微优化可能对提高性能没有多大帮助。

服务器首先评估exp1,如果为真,则评估exp2,如果exp1为假,则不评估exp2


Sql'和'逻辑运算的工作方式不同于'或'运算

服务器首先计算exp1,如果为真,则计算exp2,如果exp1为假,则不计算exp2


Sql'和'逻辑运算的工作方式不同于'或'运算

可能的重复?它是在
条件下以一种快捷方式进行计算的,因此只要一个条件匹配(
)或不匹配(
),其余条件都不会被计算。因此,强烈建议将最常见的条件放在第一位,然后按照此规则将其余条件放在第一位。这是否意味着服务器总是按照我编写表达式的相同顺序计算表达式?我可以依靠它吗?可能的重复?它是在
条件下,以一种快捷方式进行评估,因此,只要一个条件匹配(
)或不匹配(
),其余条件都不会被评估。因此,强烈建议将最常见的条件放在第一位,然后按照此规则将其余条件放在第一位。这是否意味着服务器总是按照我编写表达式的相同顺序计算表达式?我能相信吗?回答得很好@GordonLinoff,但我很肯定,在
语句中,计算总是按照您编写的方式进行的。如果不是这样,为什么
1=1的情况下,1=1和2=2的情况下,2 else 3 end
将始终返回1?@JaimeDrq。OP指的是布尔表达式,而不是
case
表达式中的
when
子句(除非我误解了这个问题)。。。我混淆了我的道歉。回答得很好@GordonLinoff,但我很肯定,在
情况下,当
语句执行时,评估总是按照您编写它的方式执行。如果不是这样,为什么
1=1的情况下,1=1和2=2的情况下,2 else 3 end
将始终返回1?@JaimeDrq。OP指的是布尔表达式,而不是
case
表达式中的
when
子句(除非我误解了这个问题)。。。我把我的道歉弄混了。