Postgresql 12 - 没有过滤条件的简单选择语句会减少 5K 行/秒的吞吐量?我们可以在这里优化啥?

Posted

技术标签:

【中文标题】Postgresql 12 - 没有过滤条件的简单选择语句会减少 5K 行/秒的吞吐量?我们可以在这里优化啥?【英文标题】:Postgresql 12 - Simple select statement without filter condition is giving less throughput of 5K rows/sec? What can we optimize here?Postgresql 12 - 没有过滤条件的简单选择语句会减少 5K 行/秒的吞吐量?我们可以在这里优化什么? 【发布时间】:2020-05-15 13:43:32 【问题描述】:

我正在尝试在没有任何过滤条件的情况下读取大约 4.5 到 500 万条记录表。 我只需要 postgres12 版本中表中的两到三列(varchar).. 该表仅包含 20 列(大多数是 varchar) 所以,我的查询是这样的。

SELECT
    id as INDIV_ID,
    loc 
FROM
    table

解释计划输出:

pgres=> explain (analyze, buffers, timing, format text) SELECT id as INDIV_ID, org_ext_loc FROM individuals;
                                                        QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------
 Seq Scan on individuals  (cost=0.00..353469.48 rows=4869048 width=54) (actual time=0.017..2659.760 rows=4869591 loops=1)
   Buffers: shared hit=2133 read=302646
 Planning Time: 0.814 ms
 Execution Time: 3092.984 ms
(4 rows)

用 track_io_timing = ON 解释计划输出

                                                        QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------
 Seq Scan on individuals  (cost=0.00..353469.48 rows=4869048 width=54) (actual time=0.019..2607.686 rows=4869591 loops=1)
   Buffers: shared read=304779
 Planning Time: 2.975 ms
 Execution Time: 3034.370 ms
(4 rows)

我们的服务器信息:

OS : Oracle Linux 7.3
RAM : 65707 MB
HDD Capacity : 2 Terabytes
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
CPU(s):                16
CPU MHz:               2294.614

我尝试了各种使用方法

范围在(另一个序列列)上的表分区 使用并行提示 将 max_parallel_workers_per_gather 设置为 8;

对详尽的搜索感到非常恼火,而且没有正确的结果,吞吐量实际上已降至 5K 行/秒。

我正在使用 pentaho(kettle) etl 工具通过服务器上的 jdbc 连接运行此查询。

我的 postgres12 服务器和 pentaho 在同一台机器上

我尝试通过两种方式创建表格

通常没有任何分区 使用范围分区

但是检索时间仍然很高..

如何才能获得大约 15K 行/秒的吞吐量?

【问题讨论】:

【参考方案1】:

执行计划说查询在 3 秒内返回 500 万行。

如果您发现客户端的性能较差,则一定是网络或客户端软件限制了您。

【讨论】:

本例中的客户端软件是 pentaho(ETL 工具)驻留在同一台机器上,如果您对此 pentaho 有任何想法,请指出.. 非常感谢并非常感谢 嗯,看起来不像track_io_timingon,至少我没有看到任何 I/O 时间。不要试图在数据库端寻找问题,它必须在其他地方。剖析整个过程!

以上是关于Postgresql 12 - 没有过滤条件的简单选择语句会减少 5K 行/秒的吞吐量?我们可以在这里优化啥?的主要内容,如果未能解决你的问题,请参考以下文章

Postgresql 查询的过滤条件中的列上的字符串操作如何影响它选择的计划

PostgreSQL 执行多个动态 WHERE 条件而不动态编写 SQL

使用 dplyr 过滤 postgreSQL 数据库中的多个值

为啥 Postgresql 使用过滤器而不是索引?

PostgreSQL - 来自许多表和OR条件的字段的gin索引

当我使用“或”条件时,为啥我的查询使用过滤而不是索引条件?