【发布时间】:2021-04-16 10:58:54
【问题描述】:
我是一个相对的 Postgres 新手,但对 MSSQL 有一些基本经验。
我在 PostgreSQL(PostGIS,它是空间的)上有一个表,其中包含大约 10,000,000 个多边形。它所在的机器有 64GB RAM、16 个内核和一个 1TB 旋转硬盘。这只是目前数据库中唯一的表。因为对表的访问不频繁(可能每隔几个小时一次),所以我注意到该表不会像我对 MSSQL 所期望的那样位于 RAM 中。相反,该表似乎已从内存中释放并处于活动状态的磁盘上。当我想查询/加入/询问等时,这会导致 15 分钟以上的 HDD 利用率达到 100%。当表似乎在内存中时,后续操作会明显更快(几秒钟而不是几分钟)。
有没有办法让 Postgres 将某个表保存在内存中,或者让调度程序/执行智能的 postgres 的任何位将表保存在内存中,而不是让它进入磁盘然后不得不需要时将其召回记忆?
我有空间索引(以及其他一些经常需要过滤/排序索引的列),所以当从内存中调用它时非常快。
同样的问题似乎也极大地影响了 JOINS,因为它们也需要先读取表。这对我来说是一个单独的问题,但似乎受到同一个根本问题的影响。磁盘 IO 绑定。
据我所知,我的数据库设置是这样的 - 所以通常我不会受到可用内存/内存的限制。
编辑:表格为 26gb
Postgres 13.2 with PostGIS 3.1.1
max_connections = '20';
shared_buffers = '8GB';
effective_cache_size = '24GB';
maintenance_work_mem = '2047MB';
checkpoint_completion_target = '0.9';
wal_buffers = '16MB';
default_statistics_target = '500';
random_page_cost = '4';
work_mem = '26214kB';
min_wal_size = '4GB';
max_wal_size = '16GB';
max_worker_processes = '16';
max_parallel_workers_per_gather = '8';
max_parallel_workers = '16';
max_parallel_maintenance_workers = '4';
【问题讨论】:
标签: postgresql postgis