18

在 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]

这真的有区别吗?

4

4 回答 4

13

通常首选完全限定名称,但需要考虑一些注意事项。我会说这在很大程度上取决于要求,一个答案可能无法满足所有情况。

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

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

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

此链接更详细地解释了在执行前解决和验证对象引用的一组步骤:http: //blogs.msdn.com/b/mssqlisv/archive/2007/03/23/upgrading-to-sql-server -2005-and-default-schema-setting.aspx

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

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

此外,如果生产环境中不允许更改数据库名称,您可能会考虑在完全限定名称中包含数据库名称。

于 2013-07-28T04:34:48.447 回答
4

在 SQL Server 中使用完全限定的表名对性能有影响吗?

由于查询文本较长,因此有更多的字节要发送到 SQL Server 并进行解析,因此会产生微不足道的损失。

惩罚是学术性的,诚实不会因为前缀而变得更好或更坏。

如果您观察到性能差异,可能是因为查询文本不同并且 SQL Server 生成了不同的计划。如果条件(统计信息,无论其他)在运行查询之间没有改变,那么 SQL Server 很可能会生成一个 100% 相同的计划。如果正在运行的带前缀和不带前缀的查询之间的条件发生了变化,那么一个计划可能比另一个更好。

尽管在那种情况下,性能差异不是因为前缀。如果您从计划缓存中逐出计划并再次运行它们(从而使 SQL Server 有机会在相同条件下生成计划),您应该会看到两个查询具有相同的计划。

限定对象名称很重要(请参阅 参考资料CREATE VIEW ... WITH SCHEMABINDING),但对性能没有影响。

于 2013-07-28T03:22:13.893 回答
2

如果您迁移或重命名数据库名称,具有数据库前缀将导致问题。这可能是 DBA 建议的原因

于 2013-07-28T04:20:10.330 回答
1

在 SQL Server 中使用完全限定的表名对性能有影响吗?是的。重用计划缓存消除了“重新编译”计划的要求。

顺便说一句:研究参数嗅探,因此计划重用不会对性能产生不利影响……另一方面。

MSDN:将新 SQL 语句与缓存中现有的、未使用的执行计划相匹配的算法要求所有对象引用都是完全限定的。例如,这些 SELECT 语句中的第一个与现有计划不匹配,第二个匹配:

从人中选择*;

从 Person.Person 中选择 *;

来源: https ://technet.microsoft.com/en-us/library/ms181055(v=sql.105).aspx

因此,MSDN 将 schema.name 视为匹配的完全限定名称。不相信这与别名表的最佳实践相关,智能感知需要帮助......浑水。

于 2015-05-28T07:58:41.540 回答