Postgres 8.3 比 9.3 快?

Tho*_*mas 0 postgresql performance windows postgresql-8.3 postgresql-9.3

我们的软件产品目前在 Windows 7 上发布,使用 Postgres 8.3 作为其数据库。在一个繁忙的站点上,可能有 24 个自动化系统每分钟生成 100 行(x100 列),3-10 个人类客户查看大约 1000 行的子集——所有这些都是一次检索,增量更新每分钟左右查询 pk + 时间戳并检索相关的新行。有一些辅助表,但此表具有主要活动。

作为有限的多主系统的第一步(以帮助地理上分离的团队),我们实施了到 9.3 的升级。性能不是第一要务,因此并未真正对其进行分析。随着发布时间的到来,管理层决定暂时放弃 9.3,理由是担心可能会降低性能和缺乏测试资源。我确信性能问题很荒谬,所以我做了一些 PgBench 测试。

使用 9.3 的 pgbench,我交替连接到本地 8.3 和 9.3 安装(不同的端口号)。我已经在这个谷歌驱动器电子表格中捕获了我的结果,但总结是通常 8.3 击败 9.3。9.3 仅在原始插入性能方面获胜。

我们对 postgresql.conf 文件进行了一些自定义,我通常将其保留在 8.3 到 9.3 之间,我将列出非默认设置

max_connections = 1000
shared_buffers = 320MB
temp_buffers = 80MB
max_prepared_transactions = 50    #8.3 only, 9.3 left at 0 (not sure why)
max_fsm_pages = 204800            #8.3 only, 9.3 doesn't have setting
autovacuum_max_workers = 30
Run Code Online (Sandbox Code Playgroud)

那么,这只是进步的代价,还是我应该在 9.3 中做些什么才能让它变得出色?

Pav*_*ule 7

通常 PostgreSQL 9.3 通常比 8.3 快 - 但很难说有什么问题。可能的来源:IO 问题,错误的 PostgreSQL 配置 - max_connections = 1000 可能是非常错误的值,默认的 work_mem 通常太小,达到硬件限制(9.1 及更高版本应该更好地使用更多 CPU),错误测试......

其他问题可能是 pgBench 中的变化。pgBench 8.3 的结果不应与 pgBench 9.3 的结果完全比较。如果你想要一个好的数字,那么你必须将 pgBench 9.3 用于 PosgreSQL 9.3 和 PostgreSQL 8.3。不要忘记 - 测试应该至少运行大约 20 分钟(更好的时间)。

第二个因素 - 可能 pgBench 对您的生产并不重要。pgBench 是具有争议价值的综合测试。它有利于初始硬件和软件测试,但不利于配置精度和数据库调优。更重要的是您的应用程序的速度 - 您应该测试慢查询或最常见查询的速度。9.3 有很多新功能 - 更好的监控,更舒适的工具,更好地优化某种查询,内置复制,在线舒适的物理备份,更智能的真空(在大型数据集上更快),......

增加 default_statistics_target 会增加查询计划的开销 - 对于非常快速和简单的查询,它可能很重要。另一方面,较高的值降低了错误估计和错误优化的可能性——这对于通常的非平凡查询很重要——规划速度稍慢(在综合测试中可以看到),但在生产中的使用要健壮得多。取决于您的应用程序(如果它使用简单或不简单的查询),此配置变量对您是否重要。

  • @AlexKuznetsov - 这是更高的 default_statistics_target 的影响。当您增加此值时,您会增加使用统计向量进行所有操作的时间。对于简单的查询(其中计划和执行非常短),这个因素可以被检测到(在像 pgbench 这样的基准测试中)。在生产中(可能性较小)-但它确实取决于使用的查询-但是许多没有准备好的语句的 INSERT 会受到影响-但是如果您使用 COPY,那么一切都很好,您永远不会看到负面影响。它类似于 INDEXES - 更多索引 => 可能更快的 SELECT,但肯定更慢 INSERT、UPDATE (3认同)