具有超过十亿行的表的Postgres性能

时间:2017-08-11 07:51:36

标签: postgresql database-performance query-performance

我正在做一个PoC来检查Postgres是否适合我们的用例。

我有以下工作量:

数据查询 表示层将在过去两周内每15分钟检索一次数据

数据加载: 每隔15分钟,将500万行数据加载到表格中,我发现该负载消耗了375MB。 每天,它将是4.8亿行,表格大小为36GB。

我加载数据几天后(表中大约有1亿行),我运行了几个查询,我发现选择的查询几小时没有响应。例如select count(*)..并选择* ..简单但繁重的查询。没有加入。

我的要求是每15分钟加载一次数据并存储几个月,但我还没有达到那么远。即使有上述工作负载的几天数据,我发现选择查询没有响应。

我想知道postgres是否对这种工作负载有任何限制,或者我没有正确调整它!我是否错过了配置任何关键参数?

我已经通过postgres官方文档(https://www.postgresql.org/about/)了解了限制,我的要求并没有真正达到postgres中指定的理论限制。

Postgres配置: 以下是我配置的postgres参数。

checkpoint_completion_target | 0.9
default_statistics_target    | 500
effective_cache_size         | 135GB
maintenance_work_mem         | 2GB
max_connections              | 50
max_stack_depth              | 2MB
max_wal_size                 | 8GB
min_wal_size                 | 4GB
shared_buffers               | 45GB
wal_buffers                  | 16MB
work_mem                     | 471859kB

服务器配置:

虚拟化硬件!

vCPUs:32

RAM:200GB

我想知道postgres是否需要物理专用硬件。也许它无法处理虚拟化硬件的负载!

感谢您对此有任何意见或建议。 BR /纳格

3 个答案:

答案 0 :(得分:1)

问题不是PostgreSQL而是硬件以及如何调整数据库。实际上雅虎,Reddit,Yandex和其他人都使用它。 从9.6开始有paralell queries,因此您可以更有效地利用CPU。

答案 1 :(得分:1)

您可以通过一些配置步骤来了解这些大量数据,从而获得更好,更快的响应。您可以使用多租户方法,为数据库编制索引,使用Linux基本系统而不是Windows。

This链接可以帮助您将这些方面与其他方面一起排序。

答案 2 :(得分:0)

从开源数据库的角度来看,Postgres是处理和处理大型数据集的公认方式之一。 Postgres不会成为问题,但还需要考虑其他重要因素,例如数据库设计和硬件配置。

对于存储和查询大数据集,从数据库设计的角度来看,表分区和索引编制的概念将更为有用。表分区功能在postgres 11/10 / 9.6 / 9.5中可用。文档链接-Table Partition

    CREATE TABLE IF NOT EXISTS parent_tbl
    (
      id                bigint,
      sp_id             integer,
      name              varchar,
      month_year        date,
     );

PARTITION TABLE(PARTITION BY sp_id)INHERT TABLE parent_tbl

    CREATE TABLE IF NOT EXISTS tbl_partition_1
    (
      CHECK (sp_id=1)
    )INHERITS (parent_tbl);
    CREATE INDEX ON tbl_partition_1(month_year);

    CREATE TABLE IF NOT EXISTS tbl_partition_2
    (
     CHECK (tsp_id=2)
    )INHERITS (parent_tbl);
    CREATE INDEX ON tbl_partition_2(month_year);

    CREATE TABLE IF NOT EXISTS tbl_partition_3
    (
     CHECK (tsp_id=3)
    )INHERITS (parent_tbl);
    CREATE INDEX ON tbl_partition_3(month_year);