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

时间:2013-07-28 03:14:22

标签: sql sql-server tsql

在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 个答案:

答案 0 :(得分:12)

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

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

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

MSDN Article为SQL Server最佳做法提供了公平的指导。 (查看名为“如何引用对象”的部分

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

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

  

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

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

答案 1 :(得分:3)

  

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

由于查询文本较长,所以有更多的字节要发送到SQL Server并进行解析,这是一个微不足道的惩罚。

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

如果您发现性能有所不同,可能是因为查询文本不同而SQL Server生成了不同的计划。如果条件(统计信息,其他任何条件)在运行查询之间不发生变化,则SQL Server将生成100%完全相同的计划。如果运行前缀和未加前缀的查询之间的条件发生了变化,那么一个计划可能比另一个更好。

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

对于限定对象名称有重要意义(请参阅CREATE VIEW ... WITH SCHEMABINDING),但对性能没有影响。

答案 2 :(得分:2)

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

答案 3 :(得分:1)

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

BTW:研究参数嗅探,因此计划重用不会对性能产生负面影响......反面。

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

SELECT * FROM Person;

SELECT * FROM Person.Person;

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

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