15

请记住,我是 sql/数据库领域的新手。

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

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

4

6 回答 6

16

这是一个广泛的话题,所以这里有很多东西供您阅读。

  • EXPLAIN 和 EXPLAIN ANALYZE对于了解 db-engine 中发生的事情非常有用
  • 确保相关列已编入索引
  • 确保不为相关的列编制索引(如果必须更新太多索引,插入/更新性能可能会下降)
  • 确保您的 postgres.conf 已正确调整
  • 了解 work_mem 是什么,以及它如何影响您的查询(主要用于较大的查询)
  • 确保您的数据库已正确规范化
  • VACUUM用于清除旧数据
  • ANALYZE更新统计(统计量的统计目标)
  • 持久连接(您可以使用 pgpool 或 pgbouncer 之类的连接管理器)
  • 了解查询是如何构造的(连接、子选择、游标)
  • 缓存数据(即 memcached)是一种选择

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

当然,阅读 postgres/databases 上的所有其他线程。:)

于 2009-04-22T23:23:14.570 回答
7

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

对所有查询运行EXPLAIN并了解其输出将使您知道查询是否尽可能快,以及是否应该添加索引。

完成后,我建议您阅读手册的服务器配置部分。有许多选项可以微调以进一步提高性能。不过,请务必了解您正在设置的选项,因为如果设置不正确,它们很容易影响性能。

请记住,每次更改查询或选项时,都要进行测试基准测试,以便了解每次更改的效果。

于 2009-04-22T21:42:21.240 回答
3

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

  1. 指数是第一部分。主键会自动编制索引。我建议在所有外键上放置索引。进一步在所有经常查询的列上放置索引,如果在查询多列的表上有大量使用的查询,则将这些列上的索引放在一起。

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

.

shared_buffers, work_mem, maintenance_work_mem, temp_buffers

如果它是专用数据库机器,您可以轻松地将其中的前 3 个设置为 ram 的一半(在具有共享缓冲区的 linux 下要小心,也许您必须调整 shmmax 参数),在任何其他情况下,这取决于多少 ram你想给postgresql。

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

于 2009-04-23T10:30:08.587 回答
2

http://wiki.postgresql.org/wiki/Performance_Optimization

于 2009-04-23T09:07:42.747 回答
1

我推荐的绝对最小值是EXPLAIN ANALYZE命令。它将始终显示子查询、连接等的细分,显示操作中实际消耗的时间量。它还会提醒您注意顺序扫描和其他令人讨厌的问题。

这是最好的开始方式。

于 2009-04-22T21:42:08.043 回答
-2

如果您信任您的文件系统,请将 fsync = off 在您的 posgresql.conf 中,否则每个 postgresql 操作将立即写入磁盘(使用 fsync 系统调用)。10 年来,我们在许多生产服务器上都关闭了这个选项,而且我们从未出现过数据损坏。

于 2009-04-23T09:50:51.287 回答