在SQL Server中使用完全限定的表名是否会对性能产生影响?
我有一个查询,在这里我要连接不同数据库中的两个表。DBA建议在主机查询中省略数据库名称,我猜这是出于性能或惯例的考虑。
所有表完全合格
USE [DBFoo] SELECT * FROM [DBFoo].[dbo].[people] a INNER JOIN [DBBar].[dbo].[passwords] b on b.[EntityID] = a.[EntityID]
首选?
USE [DBFoo] SELECT * FROM [dbo].[people] a INNER JOIN [DBBar].[dbo].[passwords] b on b.[EntityID] = a.[EntityID]
这实际上有区别吗?
通常最好使用完全限定的名称,但要考虑一些注意事项。我会说这在很大程度上取决于要求,并且一个答案可能无法满足所有情况。
请注意,这只是一个编译绑定,而不是一个执行绑定。因此,如果您对同一查询执行数千次,则只有第一个执行会“命中”查找时间,这意味着在使用完全限定名称的情况下,查找时间会更少。这也意味着使用完全限定的名称将节省编译开销(第一次执行查询时)。
其余的将重用已编译的,其中名称解析为对象引用。
此MSDN文章对SQL Server最佳做法给出了公平的指导。(检查名为“ 如何引用对象”的部分 )
该链接详细说明了在执行之前为解析和验证对象引用而执行的一组步骤:http : //blogs.msdn.com/b/mssqlisv/archive/2007/03/23/upgrading-to-sql-server -2005-and-default-schema- setting.aspx
通过第二个链接,结论表明:
显然,最佳做法仍然存在:您应该完全限定所有对象的名称,而不用担心名称解析的成本。现实情况是,仍然有许多不完善的应用程序,此设置对那些情况很有帮助。
另外,如果在生产环境中不允许更改数据库名称,则您可能会认为在完全限定的名称中包括数据库名称。