【问题标题】:Does a SQL query with fewer attributes cost less?具有较少属性的 SQL 查询是否成本较低?
【发布时间】:2021-07-03 21:57:50
【问题描述】:

我的问题很简单——属性越少的 SQL 查询成本越低吗?

示例: 假设我们的 users 表有 10 列,例如 userIdnamephoneemail、...

SELECT name, phone FROM users WHERE userId='id'

比这个便宜

SELECT * FROM users WHERE userId='id'

从资源利用的角度来看是不是真的?

【问题讨论】:

  • 无论如何,永远不要使用邪恶的SELECT *。始终只命名您实际希望返回的列,并正确限定(如果需要,还可以使用别名)。
  • 在某个时间点添加了一个名为 json_props 的列,其中包含数兆字节的数据。如果您使用select *,那么您会突然通过网络发送大量您实际上并不需要的数据
  • 我删除了不一致的数据库标签。请仅使用您真正使用的数据库进行标记。
  • 这两个查询是不同的。你应该使用你真正需要的那个。在性能方面,id 上的索引比您选择的列重要得多,除非某些列非常宽。

标签: sql utilization


【解决方案1】:

从宏观上看,两者都可以忽略不计。 如果数据按行存储,则没有太大区别,因为检索一行数据的成本并不高。也许如果其中一列特别大,那么避免对其进行检索将是有益的。

但如果数据按列存储,那么第一个更便宜,因为每个条目都存储在不同的位置。

【讨论】:

  • 这不仅仅是检索成本,还包括通过网络发送数据的成本。
  • 在 Oracle 中,这完全是错误的,正如@Justin 所解释的那样。如果您只需要两列,并且两列都包含在索引中,那么您不必去表就可以节省大量 IO。
  • 我基本同意这个答案。在总体方案中,遍历索引后额外的数据页面加载可能不是特别重要——如果数据页面已经加载到内存中,甚至可能很难衡量。如果没有索引,那么无论如何都需要进行全表扫描。有 的区别,但微优化可能并不重要,除非在列式数据库中或某些列特别宽。也就是说,Jusin 的回答也更加正确。
【解决方案2】:

视情况而定。

限制投影中的列数当然可以提高性能,但这取决于可用的索引。如果我们假设userId 是主键或至少是索引列,您会期望数据库的优化器通过使用以userId 作为前导列的索引进行查找来确定要获取的行.

如果(user_id, phone) 上有索引,或者如果phone 是索引中包含的列(如果您的数据库支持该概念),则数据库可以从用于查找行的索引中获取phone(s ) 返回。这样,数据库就不必访问实际表来获取phone。具有数据库处理查询而不访问表所需的所有信息的索引称为“覆盖索引”。粗略地说,在索引中搜索要返回的行的成本可能与访问表以获取投影的其他列的成本大致相同。如果您可以限制投影中的列数以使用覆盖索引,则可能会显着降低查询成本。更重要的是,如果访问表以获取每一列涉及执行多次读取,因为 Oracle 中的链行或外联 LOB 列、PostgreSQL 中支持 TOAST 的数据类型等。

减少投影中的列数也会减少需要通过网络发送的数据量以及客户端处理该数据所需的内存量。当您有更大的字段时,这往往是最重要的。例如,如果users 表中的一列恰好是用户记录的 LDAP 路径,则很容易达到数百个字符的长度,并占到一半的网络带宽消耗和一半的中间使用内存层。如果您正在构建一个需要为数百个用户提供服务的相对低流量的内部业务线应用程序,那么这些事情可能并不重要。如果您正在构建需要为数百万用户提供服务的大容量 SaaS 应用程序,这可能非常关键。

【讨论】:

  • @LaurenzAlbe - 包括在内。谢谢。
猜你喜欢
  • 2019-08-18
  • 2018-09-20
  • 2020-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-13
相关资源
最近更新 更多