2013-07-28 33 views
16

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

这实际上是否有所作为?

+8

不会。使用“foo.dbo.people”与使用“people”不会有运行时性能提升。或相反亦然。图书推荐:“Inside SQL Server”,Kalen Delaney等人。 – paulsm4

回答

11

完全限定名称通常是首选,但需要考虑一些注意事项。我会说这取决于需求,单个答案可能不足以满足所有情况。

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

其余部分将重新使用编译后的名称解析为对象引用。

这个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

这就是说模式限定(两个部分名称)不是三个部分名称。我肯定会避免DB对象(过程等)中的三个部分名称,因为这意味着如果数据库已重命名或以新名称恢复,则需要更改它们。 –

+0

@Martin: MSDN文章说:要引用位于远程数据库中的对象,完全限定对象名称将包括服务器名称和数据库名称。 这就是为什么MSDN文章被引用需要更多的想法。即使是MSDN的结论部分也一样:始终使用完全限定名称引用对象。 至少应使用模式名称,后跟对象名称。是的,数据库名称可以更改。然而,它更多的是在生产场景中不太可能发生。即使在测试场景(UAT)中也很少发生。 –

+0

Msdn也说:评估过程可以通过使用完全限定名称或DEFAULT_SCHEMA选项来改进。我会说这要求很大程度上取决于要求,单个答案可能不足以满足所有情况。数据库名称的更改是可能的,但迄今为止我认为这违反了许多组织遵循的标准做法。例如,因为我们通常在存储在web.config中的连接字符串中有数据库名称。这肯定会影响部署到Production环境的所有应用程序。 –

3

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

有一个微不足道的惩罚,因为查询文本更长,所以有更多的字节被发送到SQL Server和解析。

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

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

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

对符合条件的对象名称有意义(请参阅CREATE VIEW ... WITH SCHEMABINDING),但对性能没有影响。

2

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

1

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

顺便说一句:研究参数嗅探,所以计划重用不会对性能产生负面影响......另一方面。

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为完全合格的名称,它匹配。 不相信这与最佳实践的混淆表相关,intellisense需要帮助......泥泞的水域。

相关问题