PostgreSQL性能调优

16

请记住,我是sql/数据库世界的新手。

我正在每秒插入/更新数千个对象。这些对象正在多个秒间隔主动查询。

有哪些基本的事情我应该做来优化我的(postgres)数据库性能?


你需要配置postgresql.conf文件,并重新启动数据库。请参考此链接中的详细配置设置:http://tekadempiere.blogspot.ae/2014/09/tuning-postgresql-for-better-performance.html - Sajeev
6个回答

16

这是一个广泛的主题,因此这里有很多内容供您阅读。

  • EXPLAIN和EXPLAIN ANALYZE非常有用,可以帮助您了解数据库引擎中发生了什么
  • 确保相关列被索引
  • 确保不相关的列没有被索引(如果必须更新太多索引,则插入/更新性能会下降)
  • 确保postgresql.conf被适当调整
  • 了解work_mem以及它如何影响查询(对于较大的查询最有用)
  • 确保您的数据库已经适当地规范化了
  • VACUUM用于清除旧数据
  • ANALYZE用于更新统计信息(通过设置统计量目标来控制统计量的数量)
  • 持久连接(您可以使用像pgpool或pgbouncer这样的连接管理器)
  • 了解查询的构造方式(连接、子选择、游标)
  • 缓存数据(例如memcached)是一种选择

当您用尽这些选项时:添加更多内存,更快的磁盘子系统等。硬件很重要,特别是在大型数据集上。

当然,还要阅读有关postgres/数据库的所有其他帖子。:)


7

首先,请阅读官方手册的性能提示

在所有查询中运行EXPLAIN并了解其输出,将让您知道查询是否尽可能快,并且是否应该添加索引。

完成这些步骤后,建议阅读手册中的服务器配置部分。有许多选项可以进行微调以进一步增强性能。确保理解您所设置的选项,因为如果设置不正确,它们可能会阻碍性能。

请记住,每次更改查询或选项时,请测试基准测试,以便您了解每个更改的影响。


3

实际上有一些简单的规则可以让您在大多数情况下获得足够的性能:

  1. 索引是第一部分。主键自动索引。我建议在所有外键上放置索引。如果有频繁查询的列,进一步将索引放在这些列上,如果有一个表上有多个列被查询,则将这些列一起放置索引。

  2. 在您的postgresql安装中设置内存设置。将以下参数设置得更高:

.

shared_buffers, work_mem, maintenance_work_mem, temp_buffers

如果这是一台专用的数据库机器,您可以轻松地将前三个设置为内存的一半(在Linux下要小心共享缓冲区,也许您需要调整shmmax参数),在其他情况下,这取决于您想要为PostgreSQL分配多少内存。

http://www.postgresql.org/docs/8.3/interactive/runtime-config-resource.html


主键自动建立索引?为什么在pgAdmin工具的“索引”列表中没有显示出来? - mainstringargs
感谢@Mauli!从Captain Pedantic本人来看,'index'的正确复数形式是'indices'。请点赞! - Rastus7


1

我所建议的最低要求是使用EXPLAIN ANALYZE命令。它可以展示子查询、连接等操作的细节,同时显示这些操作实际耗费的时间。此外,它还会提醒你有关顺序扫描(sequential scan)和其他不良情况。

这是开始的最佳方式。


-2
在您的postgresql.conf中设置fsync = off,如果您信任您的文件系统,否则每个postgresql操作将立即写入磁盘(使用fsync系统调用)。 自从10年前开始,我们已经在许多生产服务器上关闭了此选项,并且我们从未遇到过数据损坏。

2
这是一个不好的建议。你有可能会破坏你的数据。当然,你可能会在接下来的几年里运气好,就像你现在一样。但是,使用带有电池支持写缓存的RAID控制器可以获得相同的收益,而且没有额外的风险。 - tommym
我们相信我们的ext3文件系统。写入缓存是有限制的。例如,我们自八年前开始维护Century21 France数据库;超过3000人实时写入此数据库。 我们有一个自制的中间件,在服务器崩溃时将所有查询镜像到另一个数据库中,但我们从未遇到任何问题。请参阅:http://www.postgresql.org/docs/8.1/interactive/runtime-config-wal.html - fredz
通常是错误的建议。Postgres无法保证在此设置下的一致性。关闭fsync意味着它可能甚至不会被写入磁盘缓存。不要这样做。仅仅因为您没有观察到损坏,这意义不大...特别是如果您从未遇到过崩溃。 - Tony K.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接