2009-11-10 63 views
2

查询优化对于SQL Server有不同顺序的WHERE子句有什么区别吗?SQL Server的WHERE子句的排序

例如,将这个查询计划:

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

不同从这个?:

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

当然,这是一个人为的例子,我曾尝试更复杂的了。查询计划对于两者来说都是一样的,但我总是想知道是否值得排序WHERE子句,使得最具体的子句最先出现,以防优化器以某种方式“修剪”结果并最终变得更快。

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

其他RDBMS的呢?

+0

如果col1有一个索引,而col2没有,它可能会有所不同。 – rsp 2009-11-10 10:50:05

+0

@rsp从人们所说的话来看,如何格式化查询并不会产生什么影响 - 查询优化器无论如何都会自己动手,并根据哪些列有索引等命令谓词。 – 2009-11-10 11:07:51

回答

5

每个现代的RDBMS都有一个查询优化器,它负责重新排序条件。有些优化器使用相当复杂的统计数据来做到这一点,而且他们经常打败人类直觉,认为什么是好的排序,哪些不会。所以我的猜测是:如果你可以肯定地说“这个顺序比另一个更好”,那么优化器也可以自行计算出来。

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

+0

是的,那是我的假设,但我想如果我想知道它,那么也许别人也可能有:)。 – 2009-11-10 10:59:34

+0

想知道从来没有错:-) – 2009-11-10 11:01:04

+1

有时你需要担心这样的事情,以优化您的应用程序,并使他们扩展到现实世界的需求 – Sanket 2009-11-10 11:12:28

1

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

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%) 

这是因为该功能需要进行评估的次数。

0

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

2

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

+0

我完全同意,所以我upvoted你的答案。让我想起了那句着名的引语:“程序必须是为人们阅读而写的,而且只是偶然地让机器执行。” – 2009-11-10 12:36:36

+0

汤姆:正好和thx为upvote * ggg * – 2009-11-10 12:49:52

0

SQL是“declarative”,因此它没有区别。你告诉数据库管理系统你想要什么,它会计算出最好的方式(按照成本,时间等)。

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