SQL查询中的多余空格会影响性能吗?

3
当我们编写SQL查询时,我们会添加额外的空格进行缩进,以使其更易读。这些空格可能会迅速累积。我想知道这些额外的空格是否会显著影响网络延迟和/或数据库中的查询解析时间。
1. 从客户端/ORM发送到数据库服务器的查询字符串是否也包括这些空格,还是由客户端/ORM剥离/规范化?
2. 查询字符串中有很多空格是否会显著影响性能,因此应该在合理范围内尽量减少?
为了说明这一点,以下查询总共包含577个字符:
select * from (
    select
        u.id                                                                                 as userId,
        u.name                                                                               as userName,
        sum(case when date(u.login_at) <= date('2020-12-31') then 1 else 0 end)              as loginCount,
        max(case when date(u.login_at) <= date('2020-12-31') then u.login_at else null end)  as lastLogin,
    from user u
    join user_login ul on u.id = ul.user_id
    where u.id = '12345'
    group by u.name, u.id
) x
where loginCount > 0;

相比之下,去除不必要的空格后的相同查询仅包含329个字符,查询大小减少了43%。

select * from(select u.id userId,u.name userName,sum(case when date(u.login_at)<=date('2020-12-31')then 1 else 0 end)loginCount,max(case when date(u.login_at)<=date('2020-12-31')then u.login_at else null end)lastLogin,from user u join user_login ul on u.id=ul.user_id where u.id='12345' group by u.name,u.id)x where loginCount>0;

注意:我并不赞同编写类似第二个查询的语句。我只是想知道时间上是否存在实质性差异。
1个回答

7

不会。额外的空格不会明显地影响性能。可能会在两个方面略微影响:

  • 较大的字符串可能会通过网络传输。 因此,非常慢的网络(记得拨号上网吗?)可能会减慢它的速度。
  • 编译器的标记化阶段必须跳过空格。 字符串处理这些天来相当快。 只有标记化阶段正在执行很多其他工作。

select查询的成本通常不在编译阶段。 读取数据并处理数据通常是(几乎)耗费所有时间的地方。

注意:您可以轻松地创建极端情况,例如以一百万个空格为前缀或后缀的select 1,在这种情况下编译会明显地可见。 但您必须有意地创建这样的查询字符串。


5
您应该补充说明,良好格式化的查询语句可以提高可读性,从而提高可维护性,这比省略空格节约的几纳秒更加重要。 - undefined
@LaurenzAlbe . . . 我完全同意! - undefined
@LaurenzAlbe 显然没有人会写没有缩进的长查询。但是如果查询中有30-40%的开销,网络带宽将会增加。网络相对较慢,尤其是在基于云的架构中。因此,我不会完全惊讶于一些客户端库在发送之前对SQL查询进行压缩,类似于Web服务器通过HTTP发送JSON。但我猜增加的延迟并不足以使这种做法成为必要。 - undefined
3
我使用过Oracle、SQL Server、MySQL和Postgresql的缩进查询。我使用过的客户端库都没有通过删除额外的空格来“压缩”查询语句。即使没有客户端库干扰,解析SQL本身就很困难。我要重申其他人的话,阅读和推理SQL代码的能力将节省您数百万次(真的,数百万次)的时间以及服务器的时间,而不是省略一些空格。 - undefined

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