sql - SQL 查询中过多的空格会影响性能吗?

标签 sql postgresql query-optimization

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

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

最佳答案

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

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

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

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

关于sql - SQL 查询中过多的空格会影响性能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68037146/

相关文章:

mysql - 从全文查询中删除 'duplicate'

sql - PostgreSQL 从选择中插入但忽略现有行

mysql - 选择在多行表上花费大量时间

c++ - 将货币金额四舍五入到最接近的五分之一、四分之一、1 美元、5 美元等面额的最佳方法是什么?

mysql - SQL语句插入重复数据

mysql - 奇怪的 SQL 更新行为

python - 使用现有主键插入的惩罚?

sql - 如果一列或多列为空,则将多列选择为一个字段分隔符

sql - 根据索引列在 Oracle SQL 中查找 "next 25 rows"

mysql - 使用多个 JOIN 且没有 WHERE 子句的 SQL 语句在 1 秒内检索 8000 行是否现实?