【问题标题】:How does table alias names affect performance?表别名如何影响性能?
【发布时间】:2012-01-11 21:10:59
【问题描述】:

在阅读有关调整 SQL 查询的信息时,我在某处读到“在使用多个表时,始终使用表别名并在所有列名前加上别名。”

表别名如何影响性能?或者它们真的有影响吗?

【问题讨论】:

  • 如果您使用的是 SQL Server,您可以在此处找到更多信息:stackoverflow.com/questions/11043/sql-table-aliases-good-or-bad。就个人而言,我从未听说过别名对性能有益。可读性和对数据的良好理解(反映在查询的编写方式以及连接、过滤器)对我来说更重要。

标签: sql database performance


【解决方案1】:

别名根本不会以任何实际或可衡量的方式影响性能(在编辑时添加斜体)。也就是说,它会为查询编译增加几乎没有(如果全部)可测量的延迟。一旦编译(和重用),它就没有任何效果。

当您有多个表时,别名可以消除歧义,因为您知道它来自哪个表。它还可以防止将来的表更改破坏查询。假设您将审计列添加到另一个表中已经存在的一个表中。使用这两个表的没有别名的查询将会中断。

在某些情况下,别名也是强制性的,例如架构绑定视图。

SQL 解析引擎(在执行它们之前读取所有查询,并使用这些信息来缓存已编译的查询以便将来更快地执行)是唯一查看别名的东西,并使用它来帮助消除歧义符号查找。当在执行存储之前对其进行解析时,系统已经生成符号,就像任何其他语言中的任何其他可编译语句一样。

【讨论】:

  • 迂腐,但是...解析可能受到的影响可以忽略不计。例如,Oracle 尝试通过将 sql 语句的前 n 个字符作为索引散列到 sql 语句缓存中来保存硬解析步骤。长于 n 个字符的语句可能会散列到同一个桶中,从而导致额外的检查以验证命中。短别名可以压缩语句并提供更好的机会获得独特的命中。此外,如果没有别名列,解析器必须确定该列属于哪个表。但这根本不值得考虑。可读性会更重要。
  • "在某些情况下,别名也是强制性的,例如模式绑定视图。" - 你能举个例子吗
【解决方案2】:

几乎没有,性能影响可以忽略不计,但您将有更好的时间阅读查询。这只是为了您的方便。

性能影响是分配几 kb 的内存来存储 SQL Server 程序本身中的别名等。与执行查询所需的其他操作相比,这几乎算不了什么。

【讨论】:

  • 你的意思是性能影响...任何可证明的证据?
  • 我发布的链接上的一个答案提到这是 SQL Server 2000 中的一个问题。但是,我从未见过它,查询执行计划中肯定没有提到它;-)而且,与 Table Scans 之类的成本相比,它可能不值得考虑。也许这在过去的糟糕时期是个问题?
  • 性能影响是在 SQL Server 程序本身中分配几 kb 的内存来存储别名等。就像我说的,可以忽略不计。
【解决方案3】:

我有使用别名的经验,与没有别名相比,查询花费的时间要多得多。

我在使用 PostgreSQL 时遇到过这种情况,我的查询如下。

无别名

select
    applicant.application_id,
    form_data,
    application_defect.defect_id
from
    applicant
INNER JOIN
    audit_trail on applicant.email = audit_trail.email
inner join
    application_defect on applicant.application_id = application_defect.application_id
where
    application_defect.defect_id like '1%'
and
    form_data like '%FaceApi%';

带别名

select
    ap.application_id,
    au.form_data,
    ad.defect_id
from
    applicant ap
INNER JOIN
    audit_trail au on ap.email = au.email
inner
    join application_defect ad on ap.application_id = ap.application_id
where
    ad.defect_id like '1%'
and
    form_data like '%FaceApi%';

【讨论】:

    猜你喜欢
    • 2011-08-11
    • 1970-01-01
    • 1970-01-01
    • 2013-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-16
    相关资源
    最近更新 更多