gpt4 book ai didi

postgresql - POSTGRES : Disk bound IO - possible to keep table in memory?

转载 作者:行者123 更新时间:2023-12-03 21:41:41 27 4
gpt4 key购买 nike

我是一个相对的 Postgres 新手,虽然对 MSSQL 有一些基本的经验。
我在 PostgreSQL(PostGIS,它是空间的)上有一个表,其中包含大约 10,000,000 个多边形。它所在的机器有 64GB RAM、16 个内核和一个 1TB 旋转硬盘。这只是目前数据库中唯一的表。因为对表的访问不频繁(可能每隔几个小时一次),所以我注意到该表不会像我对 MSSQL 所期望的那样位于 RAM 中。相反,该表似乎已从内存中释放并处于事件状态的磁盘上。当我想查询/加入/询问/等时,这导致 15 分钟以上的 HDD 利用率为 100%。当表似乎在内存中时,后续操作明显更快(秒而不是分钟)。
有没有办法让 Postgres 将某个表保留在内存中,或者让调度程序/执行智能的 postgres 的任何位将表保留在 ram 中,而不是让它进入磁盘然后在需要时将其召回内存?
我有空间索引(以及其他一些通常需要过滤/排序索引的列),所以当从内存中调用它时速度非常快。
同样的问题似乎也极大地影响了 JOINS,因为它们也需要先读取表。这对我来说是一个单独的问题,但似乎受到同一个根本问题的影响。磁盘 IO 绑定(bind)。
我的数据库设置是这样的——所以据我所知,通常我不会受到可用内存/内存的限制。
编辑:表是 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';

最佳答案

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

关于postgresql - POSTGRES : Disk bound IO - possible to keep table in memory?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67117580/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com