SQL Server性能和完全限定的表名

时间:2009-07-10 22:59:58

标签: sql-server performance

似乎公平地认为在查询中包含模式所有者会增加db性能,例如:

SELECT x FROM [dbo].Foo vs SELECT x FROM Foo

这应该保存查找,因为SQL Server将在连接上下文中查找属于该用户的Foo表。

今天我被告知,即使您要查询在连接字符串中选择的数据库,始终包含数据库名称也会以相同的方式提高性能:

SELECT x FROM MyDatabase.[dbo].Foo

这有什么道理吗?这作为编码标准是否有意义?这些(甚至是第一个例子)是否会转化为可衡量的收益?

我们是在谈论数据库服务器上额外字典查找的几个周期与Web服务器(或其他客户端)上更臃肿的SQL和额外连接吗?

5 个答案:

答案 0 :(得分:11)

要记住的一件事是,这是一个编译绑定,而不是执行绑定。因此,如果您执行相同的查询100万次,则只有第一次执行将“命中”查找时间,其余将重复使用相同的计划并且计划已预先绑定(名称已经解析为对象ID)。

答案 1 :(得分:4)

在这种情况下,我个人更喜欢可读性而不是可能造成的微小性能提升,如果有的话。

SELECT * FROM Foo 

似乎比以下更容易扫描:

SELECT * FROM MyDatabase.[dbo].Foo

答案 2 :(得分:1)

试试看?只需遍历一百万个查询,然后查看哪一个完成。

我猜这是一堆垃圾。 MS SQL的开发人员花费数百万小时来研究搜索算法和存储方法的效率,但却被不指定完全限定表名的用户所阻挠?可笑。

答案 3 :(得分:1)

如果默认架构相同,SQL服务器将不会进行额外查找。如果不是,则应该包含它,并且它是一个经常使用的查询。

数据库名称不会使查询性能受益。我认为这可以通过Management Studio中的Estimated Execution Plan看到。

答案 4 :(得分:0)

正如Spencer所说 - 尝试一下,当然要确保每次都清除缓存,因为这会影响你的结果。

http://www.devx.com/tips/Tip/14401

如果它有任何明显的不同,我也会感到惊讶。