Sql server SQL Server的WHERE子句的排序

Sql server SQL Server的WHERE子句的排序,sql-server,performance,Sql Server,Performance,对于SQL Server,查询优化以不同的顺序包含WHERE子句会有什么不同吗 例如,该查询计划是否会: select * from table where col1 = @var1 and col2 = @var2 与此不同吗 select * from table where col2 = @var2 and col1 = @var1 当然,这是一个人为的例子,我也尝试过更复杂的例子。这两种查询计划都是一样的,但我一直想知道是否值得对其中的子句进行排序,以便让最具体的子句排在第一位,以防

对于SQL Server,查询优化以不同的顺序包含WHERE子句会有什么不同吗

例如,该查询计划是否会:

select * from table where col1 = @var1 and col2 = @var2
与此不同吗

select * from table where col2 = @var2 and col1 = @var1
当然,这是一个人为的例子,我也尝试过更复杂的例子。这两种查询计划都是一样的,但我一直想知道是否值得对其中的子句进行排序,以便让最具体的子句排在第一位,以防优化者以某种方式“删减”结果,并可能以更快的速度结束

这实际上只是一个思维实验,我并不想解决一个特定的性能问题


其他的RDBMS呢?

不,查询优化器无论如何都会找到要使用的索引或统计信息。我不完全确定,但我甚至认为sql中的布尔表达式不是从左到右求值的,而是可以由查询优化程序按任意顺序求值。

我认为这不会有多大区别。。 所有sql语言的区别在于使用sql函数的顺序

例如: 当你这样做的时候:

select title, date FROM sometable WHERE to_char(date, 'DD-MM-YYYY') > "01-01-1960"
会比这个慢一些:

select title, date FROM sometable WHERE date > to_char('DD-MM-YYYY', %USERVALUE%)

这是因为需要对函数求值的次数太多。

每个现代RDBMS都有一个查询优化器,负责对条件进行重新排序。一些优化器使用非常复杂的统计数据来实现这一点,并且他们经常在什么是好的顺序和什么不是好的顺序上击败人类的直觉。所以我的猜测是:如果你可以肯定地说“这个排序比另一个好”,那么优化器也可以,它会自己解决这个问题


结论:不要担心这些事情。很少值得花时间。

此外,如果使用嵌套查询,排序可能会有所不同。内部查询的结果集越小,扫描外部查询所需的时间就越少。
当然,话虽如此,我还是支持rsp在上面的评论中所说的——索引是决定查询需要多长时间的关键;如果我们在列上有一个索引,SQL Server将直接进行搜索,而不是扫描值,因此,当您确定where子句中条件的顺序时,排序将变得不相关。例如,如果在两个表a和B上有一个联接,则为a编写所有条件,然后为B编写所有条件。

SQL为“”,因此没有任何区别。你告诉DBMS你想要什么,它会找出最好的方法(取决于成本、时间等)


在.net中,它会产生不同,因为它是按顺序排列和执行的。

如果col1有索引,而col2没有索引,可能会产生不同。@rsp根据人们的说法,我如何设置查询的格式不会有什么不同-查询优化者会自己做事情,并根据COL有索引的谓词排序。是的,这是我的假设,但我想如果我想知道的话,有时你需要担心这些事情,以便优化你的应用程序并使其适应现实世界的需要。我完全同意,所以我对你的答案投了赞成票。这让我想起了一句名言:“程序必须是为人们阅读而编写的,只是为了让机器执行而已。”