在阅读有关调整SQL查询的内容时,我在某处读到过这样的建议:'在使用多个表时,始终使用表别名并在所有列名前加上别名。'
表别名名称如何影响性能?它们实际上会产生影响吗?
在阅读有关调整SQL查询的内容时,我在某处读到过这样的建议:'在使用多个表时,始终使用表别名并在所有列名前加上别名。'
表别名名称如何影响性能?它们实际上会产生影响吗?
该别名实际上在任何实际或可测量的程度上都不会影响性能(在编辑时添加了斜体)。也就是说,它可能会给查询编译增加一些微不足道(如果有的话)的延迟。一旦被编译(并被重复使用),它就没有任何影响。
当你有多个表格时,别名可以消除歧义,因为你知道它来自哪个表格。它还可以防止未来的表格更改破坏查询。比如,你向一个已经存在的表格中添加审核列,而这个列在另一个表格中也存在。没有使用别名的查询将会出现错误。
在某些情况下,例如模式绑定视图,别名也是必需的。
SQL解析引擎(读取所有查询之前执行它们,并使用这些信息在将来缓存编译后的查询以进行更快的执行)是唯一查看别名的东西,并用它来帮助消除符号查找中的歧义。系统在被解析之前就已经生成了符号,就像任何其他语言中的可编译语句一样。
我有使用别名的经验,与不使用别名相比,查询所需的时间明显更长。
我在 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%';
使用别名有一些价值。
当然可以。我是从谷歌搜索进来的,这是第一个结果。我想说的是,这里给出的被接受的答案可能是不正确的。这一切都取决于你如何使用别名。在我的情况下,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"