0

我正在研究与我用Java编写的应用程序的性能相关的一系列问题,该应用程序每天有大约100,000 次点击,并且每次访问平均在 2 个主要数据库表(均分)上进行 5 到 10 次读取/写入,其基数是对于1 到 300 万条记录(我通过休眠访问数据库)。

我的两个主表存储用户信息(大约 60 列类型为 varchar、integer 和 timestamptz)和另一个链接到要显示的数据(这里大约 30 列主要是 varchar、integer、timestamptz)。

我遇到的主要问题可能是我的站点性能下降(让我们谈谈超过 5 秒的时间加载,这显然不仅仅取决于数据库性能),是使用FillFactor,目前默认值为 100(它总是在数据不变时使用..)。

显然填充因子在索引上是相同的(每 2 个 btree 类型的表有 10 个)

目前在我制作的主要桌子上

  • 40% 选择操作
  • 30% 更新操作
  • 20% 操作插入
  • 10% 删除操作。

我的数据库还由 40 个其他次要的表组成(只有其他 3 个具有相同的用户基数)。

我的问题是:

  • 您如何找到要设置的填充因子的正确值
  • 哪些可以作为检查任务清单以提高 此类数据库的性能?

数据库位于服务器专用(16GB Ram,8 核)上,存储在 SSD 磁盘上(数据全天备份并移动到另一个存储上)

4

1 回答 1

0

您可能已经达到了内存使用的“拐点”,其中频繁使用的表的整个索引不再适合共享内存,因此磁盘 I/O 正在减慢它的速度。通过检查磁盘 I/O 是否高于正常值来确认。如果是这样,请尝试增加共享内存(shared_buffers),或者如果已经达到最大值,请调整系统共享内存大小或添加更多系统内存,以便将其提高。您可能还必须开始调整临时缓冲区、工作内存和维护内存以及 WAL 参数(如 checkpoint_segments 等)。

PostgreSQL.org 上有一些性能调整提示,Google 是你的朋友。

编辑:(解决第一条评论)内存不足的第一个症状是性能大幅下降,其他一切都相同。如果您在内存使用方面遇到问题,更改表格填充因子不会有任何影响,如果有的话,它会使加载时间变得更糟(我假设这意味着“数据库读取”),因为行信息将扩展到更多页面在每个页面中有空白空间的磁盘上,因此表扫描需要更多的磁盘 I/O。但是填充因子小于 100% 可以帮助 UPDATE 操作,但我发现调整 WAL 参数可以在使用索引时补偿大部分时间(除非你已经优化了这些)。最重要的是,您需要使用 EXPLAIN 分析所有繁重的查询,看看有什么帮助。但乍一看,我 我很确定这是一个内存问题,即使是 SSD 上的数据库也是如此。我们说的是很多随机读取和随机写入,实际上很多 SSD经过大量随机小写入后,它比 HDD更糟糕。

于 2014-02-15T10:44:28.573 回答