列数是否影响PostgreSQL带投影的读取查询性能?
PostgreSQL投影操作与磁盘I/O的关系
这个说法不正确,具体分析如下:
核心原理:磁盘I/O与数据提取逻辑
PostgreSQL的磁盘读取单位是数据页(默认8KB),而非单一行或单个列。执行查询时的流程为:
- 借助
id索引快速定位符合id < 10条件的5行数据的物理位置(ctid); - 根据
ctid读取对应的数据页,而非单独读取某一行的所有列; - 从读取的数据页中直接提取查询所需的
id和name列,不会将该行的其他列(比如USERS_2的age)加载到内存中参与后续处理。
对原说法的纠正
- 原说法中“需先从磁盘读取整行再做投影”不成立:磁盘读取的是数据页,投影操作(筛选目标列)是在从数据页提取数据的阶段完成的,并非先加载整行所有列再丢弃不需要的部分。
- 投影操作的作用不止于减少客户端传输数据:它还能降低数据库内存占用量,避免不必要的列数据进入内存处理流程。
- USERS_2列数更多不会增加磁盘I/O量:由于两表
id、name内容一致,行的存储分布逻辑基本相同,读取符合条件的数据页数量一致,因此磁盘读取量与USERS_1无差异。
内容的提问来源于stack exchange,提问作者Zeeshan Shamsuddeen
相关产品推荐
相关产品推荐

