您如何确定在 Postgres 中使用的计划器成本常数?

spe*_*son 5 postgresql performance database-tuning execution-plan

我现在正在使用 Postgres 8.4。性能已开始成为一个问题,因为我们的表的规模和我们在复杂的查询已经长大,所以我开始寻找到一些性能调优,但我不是一个专家在所有的这些东西。

我注意到手册多次提到提高性能的好方法是为查询计划器使用更好的成本常量,但它也说没有简单的方法来确定要使用的成本常量。

认为常量现在可能有问题,因为估计成本似乎不是实际执行时间的稳定倍数 - 即使在最近运行 VACUUM ANALYZE 之后,它也会从 30 倍到大约 600 倍变化。(我不知道这是否是检查常量是否设置良好的有效方法,如果我错了,请纠正我)

所以,我想为查询规划器设置更好的常量。我该怎么做?我应该随机上下调整直到看起来更快,还是我应该做一些更正式的事情?是否有任何基于硬件或其他方面的指导方针?

顺便说一句,如果答案是“别担心,首先要改进其他事情会更重要”,那很好 - 对于我的实际案例,我会处理其他事情。但对于其他人的缘故,它仍然是好知道怎么一会提高常量,如果一切已经得到了改善。

Jos*_*kus 9

首先,成本不应与执行时间直接相关。它们是严格相对的;成本更高的计划需要更长的时间才能实际执行。您可以调整sequential_page_cost 以“调整”成本,使它们更接近毫秒的执行时间,但恕我直言,这是在浪费时间。

对于 99% 的用户,他们只关心三个成本常数:

Effective_cache_size:将其设置为系统上可用 RAM 的 75%。完毕。

random_page_cost:如果您使用的是高端 SAN/DAS,请将其降低到 2.0。如果您使用 SSD 或在亚马逊上,请将其降低到 1.5。否则,别管它。

Effective_io_concurrency:如果您使用的是 Linux 并且有一个驱动器阵列,请将其提高到存储数据库的驱动器(或镜像对)的数量,最多为 4。

不建议修改其他成本常数,除非您有完整的性能测试设置来确定结果是否真的有益。