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

时间:2018-10-31 19:27:30

标签: sql-server query-performance

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

示例1:

SELECT Databasename.Tablename.NameofColumn
FROM databasename.tablename

示例2:

SELECT NameofColumn
FROM tablename

使用别名或-示例3:

SELECT t.NameofColumn
FROM tablename t

1 个答案:

答案 0 :(得分:2)

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

完全限定的表名包含四个部分:[Server].[Database].[Schema].[Table]。您在上面的示例中错过了Schema,但这实际上是最重要的一个。 SQL Server将允许您在不同的架构中使用具有相同名称的对象。因此您可以在同一数据库中拥有dbo.myTablestaging.myTable。 SQL Server不在乎,但您的查询可能在乎。

即使没有相同名称的对象,添加架构仍然可以帮助引擎更快地找到您要查询的对象,因此,尽管只有很小的一部分,但仅在编译/执行中,性能得到了提升。计划步骤。

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

1。使用表别名。

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

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。将别名放在查询中每个列引用的前面。

对于您想要在3:00 AM进行故障排除的特定列,或者对于您想要在某处喝玛格丽塔酒的其他任何人,都永远不会有任何歧义。海滩,您的好友随时待命。

3。使您的别名有意义。

再次,这是关于稍后使事情一直保持正确的状态。大约十年前,亚伦·伯特兰(Aaron Bertrand)在上面写了the definitive post

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

如果必须使用其他名称还原数据库,则过程将不会运行。在我的商店中,我们希望每个过程的顶部都带有USE语句。如有需要,更不用说更改名称了。

tl; dr

您的示例3非常接近。只需将表架构添加到FROM子句中即可。