使用完全限定名称会影响性能吗?

ojh*_*ins 17 sql t-sql sql-server

在SQL Server中使用完全限定的表名是否会对性能产生任何影响?

我有一个查询,我在不同的数据库中加入两个表.DBA建议在主机查询中省略数据库名称,我猜测它是性能还是约定.

所有表格完全合格

USE [DBFoo]
SELECT * FROM [DBFoo].[dbo].[people] a
INNER JOIN [DBBar].[dbo].[passwords] b on b.[EntityID] = a.[EntityID]
Run Code Online (Sandbox Code Playgroud)

首选?

USE [DBFoo]
SELECT * FROM [dbo].[people] a
INNER JOIN [DBBar].[dbo].[passwords] b on b.[EntityID] = a.[EntityID]
Run Code Online (Sandbox Code Playgroud)

这实际上有所作为吗?

R.C*_*R.C 12

通常首选完全限定名称,但有些注意事项适用.我会说这很大程度上取决于要求,单个答案可能不足以满足所有情况.

请注意,这只是一个编译绑定,而不是执行绑定.因此,如果您执行相同的查询一千次,则只有第一次执行将"命中"查找时间,这意味着在完全限定名称的情况下查找时间较少.这也意味着使用完全限定名称将节省编译开销(第一次执行查询时).

其余的将重用已编译的,其中名称被解析为对象引用.

MSDN文章提供了有关SQL Server最佳实践的公平指导.(查看名为:如何引用对象的部分)

此链接详细说明了在执行之前为解析和验证对象引用而完成的一组步骤:http://blogs.msdn.com/b/mssqlisv/archive/2007/03/23/upgrading-to-sql-server -2005-和默认架构setting.aspx

通过第二个链接,结论说:

显然,最佳实践仍然存在:您应该完全限定所有对象名称,而不必担心名称解析成本.实际情况是,仍有许多不完美的应用程序,这种设置对这些情况有很大帮助.

此外,如果生产环境中不允许更改数据库名称,则可以考虑将数据库名称包括在完全限定名称中.

  • 那是谈论模式限定(两个部分名称)而不是三个部分名称。我绝对会避免在 DB 对象(过程等)中使用三部分名称,因为这意味着如果 DB 被重命名或以新名称恢复,它们将需要更改。 (2认同)