高效的数据库操作

时间:2011-01-26 15:11:45

标签: java performance postgresql jdbc

以下是我正在研究工作解决方案的方案。我们在postgres中有一个表格,用于存储网络上发生的事件。目前它的工作方式是,当网络事件到来时插入行,同时删除与特定时间戳匹配的旧记录,以便将表大小限制为大约10,000条记录。基本上,与日志轮换类似的想法。网络事件一次成千上万,因此交易率太高导致性能下降,有时服务器崩溃或变得非常慢,最重要的是,客户要求保持表大小高达百万条记录这将加速性能下降(因为我们必须继续删除匹配特定时间戳的记录)并导致空间管理问题。我们使用简单的JDBC来读/写表。那里的技术社区可以建议更好的方法来处理此表中的插入和删除吗?

2 个答案:

答案 0 :(得分:4)

我想我会使用分区表,可能是所需大小的10倍,插入最新的,并删除最旧的分区。

http://www.postgresql.org/docs/9.0/static/ddl-partitioning.html

这使得负载开始减少最早的"比查询和删除小得多。

更新:我同意nos'但是注释,插入/删除可能不是你的瓶颈。也许先调查一下。

答案 1 :(得分:0)

你可以试试的一些事情 -

  • 写入日志,有一个单独的批处理。写信给表。
  • 保持写入不变,定期删除或在流量较低时进行删除。
  • 写入缓冲区/缓存,是否从缓冲区发生了实际的数据库写入。

一些一般性建议 -

  • 由于您是根据时间戳删除的,因此请确保将时间戳编入索引。您也可以使用计数器/自动递增的rowId(例如,删除其中id< currentId -1000000)。
  • 此外,JDBC批量写入比单个行写入更快(数量级加速,很容易)。如果可以缓冲写入,那么一次批量写入100行将有很大帮助。