【问题标题】:Does excess whitespace in SQL queries affect performance?SQL 查询中多余的空格会影响性能吗?
【发布时间】:2021-09-03 07:24:12
【问题描述】:

当我们编写 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;

注意:我不赞成像第二个那样编写查询。我只是想知道在时间上是否有实质性差异。

【问题讨论】:

    标签: sql postgresql query-optimization


    【解决方案1】:

    没有。额外的空白不会显着影响性能。可能会在两个地方产生一点影响:

    • 较大的字符串可能会通过网络传递。所以一个非常慢的网络(还记得拨号吗?)可能会减慢它的速度。
    • 编译器的标记化阶段必须跳过空白。如今,字符串处理速度非常快。只是标记化阶段正在做很多其他工作。

    无论如何,select 查询的成本很少在编译阶段。读取数据和处理数据通常是(几乎)所有时间都花费的地方。

    注意:您可以简单地创建边缘情况,例如 select 1 后面或前面有一百万个空格,编译很明显。但是你必须故意创建这样一个查询字符串。

    【讨论】:

    • 您应该补充一点,格式良好的查询增加的可读性提高了可维护性,这大大超过了通过省略空格可以节省的几纳秒。
    • @LaurenzAlbe 。 . .我完全同意!
    • @LaurenzAlbe 显然没有人会在没有缩进的情况下编写长查询。但是如果 30-40% 的查询是开销,网络带宽将会增加。网络相对较慢,尤其是在基于云的架构中。因此,如果某些客户端库在发送之前压缩 SQL 查询,我不会感到完全震惊,类似于通过 HTTP 发送 JSON 的 Web 服务器。但我想增加的延迟并不足以保证这一点。
    • 我在 Oracle、SQL Server、MySQL 和 Postgresql 中使用过缩进查询。我使用过的所有客户端库都没有通过剥离额外的空白来“压缩”查询。即使没有客户端库对其进行处理,SQL 也很难进行健壮的解析。我会回应其他人的说法,即阅读和推理 SQL 代码的能力将为您节省数百万 - 真的,数百万 - 是您的时间和服务器时间的数百万倍,因为您可以节省一点空白。
    猜你喜欢
    • 1970-01-01
    • 2011-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-17
    • 2014-07-13
    相关资源
    最近更新 更多