为SQL Server排序WHERE子句

时间:2009-11-10 10:45:57

标签: sql-server performance

查询优化是否可以使SQL Server的WHERE子句具有不同的顺序?

例如,查询计划是否为:

select * from table where col1 = @var1 and col2 = @var2

与此不同?:

select * from table where col2 = @var2 and col1 = @var1

当然这是一个人为的例子,我尝试过更复杂的例子。查询计划对于两者都是相同的,但我总是想知道是否值得订购WHERE子句,以便最具体的条款首先出现,以防优化器以某种方式“修剪”结果并最终可能更快。

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

其他RDBMS也是如此?

6 个答案:

答案 0 :(得分:5)

每个现代RDBMS都有一个查询优化器,除其他外,它负责重新排序条件。一些优化器使用非常复杂的统计数据来做到这一点,并且它们经常超越人类的直觉,关于什么是好的排序,什么不是。所以我的猜测是:如果你可以肯定地说“这个排序比另一个好”,那么优化器也可以,并且它会自己解决。

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

答案 1 :(得分:2)

当您确定where子句中条件的顺序时,人类的可读性应该是您唯一的目标。例如,如果在两个表A和B上有连接,则为A写入所有条件,然后为B写入所有条件。

答案 2 :(得分:1)

不,查询优化器无论如何都会找出要使用的索引或统计信息。我不完全确定,但我甚至认为sql中的布尔表达式不是从左到右计算的,但可以通过查询优化器以任何顺序进行评估。

答案 3 :(得分:0)

我认为这不会产生太大影响。 所有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%)

这是因为需要评估函数的次数。

答案 4 :(得分:0)

此外,如果您使用嵌套查询,排序可能会有所不同。内部查询的结果集越小,外部查询需要对其进行扫描的次数越少。 当然,话虽如此,我在上面的评论中说的是 rsp - 索引是确定查询需要多长时间的主要关键;如果我们在列上有索引,SQL Server将直接执行SEEK而不是扫描值,因此,排序将变得无关紧要

答案 5 :(得分:0)

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

在.net中,它会有所不同,因为它是procedural并按顺序执行。