在PostgreSQL中增加共享缓冲区的缺点是什么

在PostgreSQL中增加共享缓冲区的缺点是什么,postgresql,performance,database-administration,Postgresql,Performance,Database Administration,我注意到在查询PostgreSQL时,如果数据没有加载到shared\u buffer中,性能会显著下降,差异几乎是100倍。因此,在优化查询的过程中,我想知道是否有任何方法可以通过增加共享\u缓冲区来提高性能 然后我开始研究PostgreSQL中的共享缓冲区。我发现推荐值是操作系统内存的25%,PostgreSQL将利用操作系统缓存来加速查询。但是从我自己的数据库中看到,从磁盘读取与从共享缓冲区读取有很大的区别,所以我想大部分时间从共享缓冲区查询 所以我想知道,如果我在PostgreSQL中增

我注意到在查询PostgreSQL时,如果数据没有加载到
shared\u buffer
中,性能会显著下降,差异几乎是100倍。因此,在优化查询的过程中,我想知道是否有任何方法可以通过增加
共享\u缓冲区来提高性能

然后我开始研究PostgreSQL中的
共享缓冲区。我发现推荐值是操作系统内存的
25%
,PostgreSQL将利用操作系统缓存来加速查询。但是从我自己的数据库中看到,从磁盘读取与从共享缓冲区读取有很大的区别,所以我想大部分时间从共享缓冲区查询

所以我想知道,如果我在PostgreSQL中增加
共享缓冲区
,会有什么负面影响?如果在我的只读实例中只增加
共享\u缓冲区
,会怎么样?

一些工作负载(我知道
下拉表
,但可能还有其他工作负载)使用较小的
共享\u缓冲区
执行得更好。但本质上,这是一个反复试验的问题(或者更好的是:可重复的性能测试)

如果您可以将
共享\u缓冲区
设置得足够大,使其能够容纳数据库中所需的所有内容,这可能是一个不错的选择。

一些工作负载(我知道
DROP TABLE
,但可能还有其他工作负载)使用较小的
共享\u缓冲区
执行得更好。但本质上,这是一个反复试验的问题(或者更好的是:可重复的性能测试)


如果您可以将
共享\u缓冲区
设置得足够大,使其能够容纳数据库中所需的所有内容,那么这可能是一个不错的选择。

增加缓冲区缓存的一个缺点是双缓冲。当您需要将页面读入共享缓冲区时,可能首先需要逐出现有页面以为其腾出空间。但是,操作系统缓存可能也需要从自身移出一个页面,以便为它从实际磁盘读取页面腾出空间。最后,同一页位于两个位置,这会浪费缓存空间。因此,您更可能需要从实际磁盘读取页面,而不是从操作系统缓存读取页面,这要慢得多。从双缓冲的角度来看,您可能希望共享_缓冲区比系统RAM的一半小得多(使用OS缓存作为主缓存),或者比一半大得多(使用共享_缓冲区作为主缓存)

另一个缺点是,如果它太大,您可能会开始出现内存不足错误或调用OOM killer,或者以其他方式破坏系统的稳定性


另一个问题是,在某些情况下,在执行某些操作(如删除表、截断或结束副本)后,PostgreSQL需要使许多缓冲区失效,并选择通过搜索整个缓冲区缓存来实现这一点。如果你做了很多这样的操作,那么这段时间加起来会有很大的缓冲区缓存设置。

增加缓冲区缓存的一个缺点是双重缓冲。当您需要将页面读入共享缓冲区时,可能首先需要逐出现有页面以为其腾出空间。但是,操作系统缓存可能也需要从自身移出一个页面,以便为它从实际磁盘读取页面腾出空间。最后,同一页位于两个位置,这会浪费缓存空间。因此,您更可能需要从实际磁盘读取页面,而不是从操作系统缓存读取页面,这要慢得多。从双缓冲的角度来看,您可能希望共享_缓冲区比系统RAM的一半小得多(使用OS缓存作为主缓存),或者比一半大得多(使用共享_缓冲区作为主缓存)

另一个缺点是,如果它太大,您可能会开始出现内存不足错误或调用OOM killer,或者以其他方式破坏系统的稳定性


另一个问题是,在某些情况下,在执行某些操作(如删除表、截断或结束副本)后,PostgreSQL需要使许多缓冲区失效,并选择通过搜索整个缓冲区缓存来实现这一点。如果你做了很多这样的操作,那么这段时间加起来会有很大的缓冲区缓存设置。

你有使用AWS RDS PostgreSQL的经验吗?我不确定是应该选择共享缓冲区还是操作系统缓存作为AWS RDS中的主缓存。您是否有使用AWS RDS PostgreSQL的经验?我不确定是应该选择共享缓冲区还是操作系统缓存作为AWS RDS中的主缓存。