3

SELECT查询一个表时l,没有连接,有数十亿行,通过将查询拆分为多个查询来运行并发查询是一个好主意,按索引列拆分为不同的子集/范围,比如整数主键id?或者 Postgres 内部是否已经这样做了,导致最终用户的速度没有显着提高?

我有两个用例:

  1. 获取总行数

  2. 获取ids的列表

Edit-1:查询对其中一列未编入索引的列有条件子句,而其他列已编入索引

SELECT id 
FROM l 
WHERE indexed_column-1='A' 
  AND indexed_column-2='B' 
  AND not_indexed_column-1='C'
4

3 回答 3

3

Postgres 从 9.6 版开始就内置了并行化。(在当前版本中进行了改进。)这将比SELECT在大桌子上手动拆分 a 效率更高。

您可以根据max_parallel_workers需要设置优化的数量。

虽然您只对该id列感兴趣,但它可能有助于建立一个索引(假设它是 PK)并满足仅索引扫描(id)的先决条件。

于 2019-07-01T05:10:59.350 回答
3

如果您想计算行数,您可以让 PostgreSQL 的内部查询并行化来完成这项工作。它会更快,结果将是一致的。

在要获取主键列表的情况下,这取决于WHERE查询的条件。如果您只选择几行,并行查询会做得很好。

如果你想要所有 id的表,PostgreSQL 可能不会选择并行计划,因为在工作进程之间交换这么多值的成本将超过并行化的优势。在这种情况下,您可能会更快地使用并行会话,正如您所设想的那样。

于 2019-07-01T05:22:52.753 回答
0

这个 4 列的复合索引可能比使用并行更快:

INDEX(indexed_column-1, indexed_column-2,  -- first, in either order
      not_indexed_column-1, id)
于 2019-07-13T23:57:07.293 回答