代码之家  ›  专栏  ›  技术社区  ›  DV82XL

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

  •  0
  • DV82XL  · 技术社区  · 3 年前

    当我们编写SQL查询时,我们会为缩进添加额外的空间,使其更具可读性。这些空间可以很快加起来。我想知道这些额外的空间是否可以 明显地 影响网络延迟和/或DB中的查询解析时间。

    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;
    

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

    0 回复  |  直到 3 年前
        1
  •  7
  •   Gordon Linoff    3 年前

    不。额外的空白不会 明显地 影响性能。可能会在两个地方产生一些影响:

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

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

    注意:您可以简单地创建边缘案例,例如 select 1 后面或前面有一百万个空格,其中编译 引人注目。但是您必须有意创建这样一个查询字符串。