表别名对性能有什么影响?

28

在阅读有关调整SQL查询的内容时,我在某处读到过这样的建议:'在使用多个表时,始终使用表别名并在所有列名前加上别名。'

表别名名称如何影响性能?它们实际上会产生影响吗?


4
如果您正在使用SQL Server,可以在此处找到更多信息:https://dev59.com/S3VD5IYBdhLWcg3wWKLc。就个人而言,我从未听说过别名会带来性能上的好处。对我而言,易读性和对数据的良好理解(这反映在查询的编写方式和连接、筛选条件中)更为重要。 - dash
5个回答

45

该别名实际上在任何实际或可测量的程度上都不会影响性能(在编辑时添加了斜体)。也就是说,它可能会给查询编译增加一些微不足道(如果有的话)的延迟。一旦被编译(并被重复使用),它就没有任何影响。

当你有多个表格时,别名可以消除歧义,因为你知道它来自哪个表格。它还可以防止未来的表格更改破坏查询。比如,你向一个已经存在的表格中添加审核列,而这个列在另一个表格中也存在。没有使用别名的查询将会出现错误。

在某些情况下,例如模式绑定视图,别名也是必需的。

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


4
学究式的,但是……解析可能会受到微不足道的影响。例如,Oracle试图通过将SQL语句的前n个字符哈希为SQL语句缓存中的索引来保存硬解析步骤。长度超过n个字符的语句可能会哈希到同一个桶中,导致需要进行额外的检查以验证命中。短别名可以压缩语句并提供更好的唯一命中机会。此外,如果没有为列设置别名,则解析器必须确定该列属于哪个表。但这根本不值得考虑。可读性更为重要。 - Glenn
“在某些情况下,例如模式绑定视图,别名也是必需的。” - 你能举个例子吗? - Eggcellentos

2
几乎没有影响性能,但你会更轻松地阅读查询。这只是为了方便你。
性能影响是在SQL Server程序中分配一些KB的内存来存储别名等内容。与执行查询所需的其他操作相比,这几乎可以忽略不计。

你暗示了性能会受到影响...有任何可证明的证据吗? - gbn
我发布的链接中的一个答案提到这是SQL Server 2000中的一个问题。然而,我从未见过它,当然也没有在查询执行计划中提到;与像表扫描之类的开销相比,它可能不值得考虑。也许这是在那些不好的旧日子里的一个问题? - dash
4
性能影响是在SQL Server程序本身中分配几KB的内存来存储别名等内容。就像我之前所说,非常小。 - Vladislav Zorov

0

我有使用别名的经验,与不使用别名相比,查询所需的时间明显更长。

我在 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 ad.application_id = ap.application_id
where
    ad.defect_id like '1%'
and
    form_data like '%FaceApi%';

0

使用别名有一些价值。

  1. 它提高了可读性
  2. 大多数SQL编译器会缓存查询,因此只有初始查询会有不同的执行效果,并且差异很小。
  3. 在大多数情况下,您是从需要通过网络提交请求的应用程序进行查询。使用别名可以大大减少传输的数据量,因此大量的请求将占用较少的网络带宽,并且整体上提高应用程序的性能。

-1

当然可以。我是从谷歌搜索进来的,这是第一个结果。我想说的是,这里给出的被接受的答案可能是不正确的。这一切都取决于你如何使用别名。在我的情况下,ORM为表中的每个列生成了一个别名。而性能下降是显著的。确切地说,执行时间翻倍。

PostgreSQL示例版本15:


ORM 生成的查询:

SELECT id AS id_0, uuid AS uuid_1, preg AS preg_2, type AS type_3, company AS company_4, command AS command_5, desc AS desc_6, add_ref AS add_ref_7, reference AS reference_8, zipcode AS zipcode_9, mid_code_id AS mid_code_id_10, code_name AS code_name_11, code_ip AS code_ip_12, margin AS margin_13, contract_term AS contract_term_14, contract_date AS contract_date_15, misc_data AS misc_data_16, port AS port_17, stts AS stts_18, location_lat AS location_lat_19, location_lon AS location_lon_20 FROM internet_service

导致了:

"Seq Scan on internet_service  (cost=0.00..106.03 rows=503 width=1493) (actual time=0.010..0.204 rows=503 loops=1)"
"Planning Time: 0.058 ms"
"Execution Time: 0.230 ms"

查询时不生成别名:

SELECT * FROM internet_service

导致了:

"Seq Scan on internet_service  (cost=0.00..106.03 rows=503 width=1493) (actual time=0.007..0.097 rows=503 loops=1)"
"Planning Time: 0.054 ms"
"Execution Time: 0.119 ms"

1
多次运行它们,看看会发生什么。 - shawnt00

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接