POSTGRES:磁盘绑定IO-可以将表保存在内存中吗?

我是一个相对的 Postgres 新手,但对 MSSQL 有一些基本的经验。

我有一个关于 PostgreSQL(PostGIS,它是空间的)的表,其中包含大约 10,000,000 个多边形。它所在的机器有 64GB RAM、16 个内核和一个 1TB 旋转硬盘。这只是目前数据库中仅有的表。因为很少访问该表(可能每隔几个小时一次),所以我注意到该表不会像我对 MSSQL 所期望的那样留在 RAM 中。相反,该表似乎从内存中释放并以活动状态位于磁盘上。当我想查询/加入/询问/等时,这导致 100% 硬盘利用率超过 15 分钟。当表似乎在内存中时,后续操作明显更快(秒而不是分钟)。

有没有办法让 Postgres 将某个表保留在内存中,或者让调度程序/执行智能的任何 postgres 位将表保存在 ram 中,而不是让它进入磁盘,然后在需要时将其重新调用到内存中?

我有空间索引(和其他几个经常需要过滤/排序索引的列),所以当从内存中调用时它非常快。

同样的问题似乎也严重影响了 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';

回答

你没有说桌子有多大。

数据永远不会因为无聊而从共享缓冲区中逐出。只是为了给其他东西腾出空间,或者因为它们变得无效(表被丢弃或被截断等)。因此,如果您使共享缓冲区足够大并使用 pg_prewarm 读取整个表,它将一直停留在那里直到被替换。(有一种对大表进行顺序扫描的机制,它会优先驱逐它刚刚读取的数据,以便为同一表中的更多数据腾出空间,但 pg_prewarm 不受此限制)。如果整个数据库适合共享缓冲区,它将无限期保留。

股票 postgresql 没有提供其他方法将表或表列表固定到内存中。


以上是POSTGRES:磁盘绑定IO-可以将表保存在内存中吗?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>