在 SELECT 语句中写入完整路径是否会提高性能 SQL?

Does writing the full path in SELECT statements enhance performance SQL?

写入完整查询路径时查询性能是否受到影响。编写此类查询时的最佳做法是什么?假设脚本比以下脚本更复杂、更长。

示例 #1:

SELECT Databasename.Tablename.NameofColumn
FROM databasename.tablename

示例 #2:

SELECT NameofColumn
FROM tablename

或使用别名 - 示例 #3:

SELECT t.NameofColumn
FROM tablename t

在编写将要发布到生产环境中的查询时,有许多注意事项,如何以及何时使用完全限定名称是这些注意事项之一。

完全限定的 table 名称包含四个部分:[Server].[Database].[Schema].[Table]。您在上面的示例中错过了 Schema,但它实际上是最重要的一个。 SQL 服务器将允许您在不同模式中拥有同名对象;所以你可以在同一个数据库中有 dbo.myTablestaging.myTable。 SQL 服务器不关心,但您的查询可能关心。

即使没有同名对象,添加架构仍然可以帮助引擎更快地找到您正在查询的对象,因此您的性能会得到提升,尽管幅度很小,而且仅在 compile/execution 计划步骤。

但是,除了性能之外,当您需要重新访问您的代码时,为了您自己的利益,您还需要担心可读性,以及当其他人需要查看您的代码时的常规性。约定因商店而略有不同,但这里有一些通用性,至少可以使您的代码更易于查看,例如,在 Stack Overflow 上。

1.使用 table 别名。

这在大约三个列名之后变得几乎不可读:

SELECT 
  SchemaName.Tablename.NameofColumn1,
  SchemaName.Tablename.NameofColumn2,
  SchemaName.Tablename.NameofColumn3
FROM SchemaName.TableName

这对大脑来说更容易:

SELECT 
  tn.NameofColumn1,
  tn.NameofColumn2,
  tn.NameofColumn3
FROM SchemaName.TableName as tn 

2。将别名放在查询中各处的每个列引用前面。

对于某个 table 特定列来自哪个列,无论是对您而言,当您在 3:00 AM 尝试对其进行故障排除时,还是对其他任何人,都不应有任何歧义,当你在沙滩上啜饮玛格丽塔酒时,你的伙伴随时待命。

3。让您的别名有意义。

同样,这是为了让事情在你的头脑中保持清醒。大约十年前,Aaron Bertrand 在上面写了 the definitive post

4.如果需要,请在 FROM 子句中包含数据库名称,但是...*

如果您必须使用不同的名称来恢复数据库,您的过程将不会 运行。在我的店里,我们更喜欢在每个 proc 的顶部有一个 USE 语句。如果需要,可以更改名称的地方更少。

tl;dr

您的示例 #3 非常接近。只需将 table 架构添加到 FROM 子句。