【问题标题】:POSTGRES: Disk bound IO - possible to keep table in memory?POSTGRES:磁盘绑定 IO - 可以将表保存在内存中吗?
【发布时间】: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


    【解决方案1】:

    你没有说桌子有多大。

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

    Stock postgresql 没有其他方法可以将表或表列表固定到内存中。

    【讨论】:

    • 好的,我想我们正在做一些事情。我的共享缓冲区大小是 8gb,但查询我的表的大小(包含几何图形)显示它是 26gb。我可以合理地增加共享缓冲区的大小,比如 32gb 并且不期望引起太多其他戏剧吗?我也有点不清楚如何适当地预热。基本前提是我将上面的几何表与其他两个表连接到一个视图中,然后从视图中选择一个带有 case 语句的选择。预热几何表时,这可能会影响连接吗?连接的表每天更新。
    • 如果你有足够的内存,你可以这样做。
    猜你喜欢
    • 1970-01-01
    • 2010-11-29
    • 2010-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-24
    • 1970-01-01
    相关资源
    最近更新 更多