我的问题很简单 - 具有较少属性的 SQL 查询成本是否会较低?
示例:假设我们的users
表有 10 列,例如userId
, name
, phone
, email
, ...
SELECT name, phone FROM users WHERE userId='id'
Run Code Online (Sandbox Code Playgroud)
比这个便宜
SELECT * FROM users WHERE userId='id'
Run Code Online (Sandbox Code Playgroud)
从资源利用的角度来看是这样吗?
这取决于。
限制投影中的列数当然有可能提高性能,但这取决于可用的索引。如果我们假设它userId
是主键或至少是一个索引列,那么您会期望数据库的优化器通过使用作为userId
前导列的索引进行查找来确定要获取哪些行。
如果索引上有索引(user_id, phone)
,或者phone
索引上包含列,如果您的数据库支持该概念,则数据库可以phone
从用于查找要返回的行的索引中获取 。通过这种方式,数据库永远不必访问实际的表来获取phone
. 拥有数据库处理查询所需的所有信息而无需访问表的索引称为“覆盖索引”。粗略地说,在索引中搜索要返回的行的成本可能与访问表以获取用于投影的其他列的成本大致相同。如果可以限制投影中的列数以便使用覆盖索引,则可能会显着降低查询成本。更重要的是,如果由于 Oracle 中的链接行或外联 LOB 列、PostgreSQL 中的 TOAST 数据类型等原因,访问表来获取每一列涉及执行多次读取。
减少投影中的列数还将减少需要通过网络发送的数据量以及客户端处理该数据所需的内存量。当您拥有较大的字段时,这一点往往最为重要。例如,如果表中的一列users
恰好是用户记录的 LDAP 路径,则其长度很容易达到数百个字符,并且占用中间层消耗的网络带宽和内存使用的一半。如果您正在构建需要为数百个用户提供服务的流量相对较低的内部业务应用程序,那么这些事情可能并不重要。如果您正在构建需要为数百万用户提供服务的大容量 SaaS 应用程序,这可能非常重要。
归档时间: |
|
查看次数: |
335 次 |
最近记录: |