编写完整的查询路径时,查询的性能是否受到影响。编写此类查询的最佳实践是什么?假设脚本比以下脚本更复杂,更长。
示例1:
SELECT Databasename.Tablename.NameofColumn
FROM databasename.tablename
示例2:
SELECT NameofColumn
FROM tablename
使用别名或-示例3:
SELECT t.NameofColumn
FROM tablename t
答案 0 :(得分:2)
在编写要发布到生产环境中的查询时,有许多注意事项,其中,如何以及何时使用完全限定的名称是这些注意事项之一。
完全限定的表名包含四个部分:[Server].[Database].[Schema].[Table]
。您在上面的示例中错过了Schema
,但这实际上是最重要的一个。 SQL Server将允许您在不同的架构中使用具有相同名称的对象。因此您可以在同一数据库中拥有dbo.myTable
和staging.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
子句中即可。