当专门为 BI/Analytics 目的启动热备用服务器时,长时间运行的查询可能很常见,打开hot_standby_feedback
或将max_standby_*_delay
设置设置为 -1 更好吗?
我的理解是,在设置允许在hot_standby_feedback
主服务器上开始但备用服务器(如有必要)等待应用任何可能与长运行查询。VACUUM
max_standby_*_delay
VACUUM
此外,文档状态为hot_standby_feedback
:
如果发现备用查询取消的数量不可接受,则存在补救的可能性。第一个选项是设置参数 hot_standby_feedback,它可以防止 VACUUM 删除最近失效的行,因此不会发生清理冲突。如果您这样做,您应该注意这将延迟清除主数据库上的死行,这可能会导致不希望的表膨胀。但是,清理情况不会比备用查询直接在主服务器上运行更糟糕,并且您仍然可以从将执行卸载到备用服务器上获得好处。
对于max_standby_*_delay
文档状态:
如果备用服务器的任务是作为决策支持查询的附加服务器,则可以将最大延迟值设置为数小时,甚至 -1,这意味着永远等待查询完成。
我仍然不清楚哪个更好,每个的确切优点和缺点是什么?
启用后,仍然可以完成真空,但效率会降低,因为
hot_standby_feedback
一些原本会被真空的元组现在必须延迟到以后的真空。我所知道的唯一真正的缺点是膨胀增加。这有多少缺点完全取决于您的使用情况。最坏的情况是,如果您的数据库有小型、密集更新的表,例如工作队列表。那些可能会变得非常臃肿。如果你没有那种桌子,你可能不会有问题。max_standby_*_delay 的问题是,在备用数据库上运行的其他查询也有可能大量延迟其范围,并且如果您将备用数据库延迟足够长的时间,累积的未重放 WAL 文件将填满您的硬盘驱动器你将失去待机。
hot_standby_feedback
影响主服务器的活动,而max_standby_*_delay
影响备用服务器的活动。缺点
hot_standby_feedback
很明显:发生冲突时,Primary 无法删除死元组。max_standby_*_delay
用于备用服务器,不影响主服务器的活动。这是这些参数的优点之一。它们的缺点如下:当备用数据库发生冲突时,它的备用数据库暂停重播 WAL 日志长达max_standby_*_delay
. 因此,如果一个查询发生了一次冲突,那么后续查询会读取旧数据(冲突发生前的数据库快照),由于备用数据库暂停重播 WAL,因此无法读取最新数据。如果您只在备用服务器上运行一个查询,我认为您可以设置
-1
为 max_standby_*_delay。