似乎公平地认为在查询中包含模式所有者会增加db性能,例如:
SELECT x FROM [dbo].Foo
vs SELECT x FROM Foo
。
这应该保存查找,因为SQL Server将在连接上下文中查找属于该用户的Foo表。
今天我被告知,即使您要查询在连接字符串中选择的数据库,始终包含数据库名称也会以相同的方式提高性能:
SELECT x FROM MyDatabase.[dbo].Foo
这有什么道理吗?这作为编码标准是否有意义?这些(甚至是第一个例子)是否会转化为可衡量的收益?
我们是在谈论数据库服务器上额外字典查找的几个周期与Web服务器(或其他客户端)上更臃肿的SQL和额外连接吗?
答案 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)