【问题标题】:Postgres Slow and delayed insertionsPostgres 缓慢和延迟的插入
【发布时间】:2014-09-08 10:16:32
【问题描述】:

我遇到了数据库插入缓慢和延迟的问题。 情况是什么,我有一个表mobiledata,其中插入量很高。它有一个主键作为 id (bigserial)。 id nextval 来自序列 mobiledata_seq。 当我在表中看到插入时,插入行时缺少序列。该行也在一段时间后插入,比如 10 秒 这在极少数情况下会发生,有时它就像一种魅力。

例子:

Select id from missingdata order by id desc limit 100;
输出 611815 611813 611810 611809 611807 611805 611804 611802 611801 611800 611799 611798 611797 611796 611795

【问题讨论】:

  • 听起来更像是某些事务正在丢弃来自nextval 的调用。序列生成列中的间隙意味着缺少某些内容。序列缓存也可以在这里发挥作用。
  • 首先:检查 postgres 日志文件(可能还有应用程序日志文件,如果有的话)

标签: mysql sql performance postgresql


【解决方案1】:

如果您的插入率非常高,则服务器可能正在努力将您的数据刷新到磁盘。另一种可能性是,如果您在此表上创建了太多索引,服务器必须在插入期间更新所有索引,这可能会变得非常昂贵。

解决方案可能是:

  • 在您的 postgresql.conf 上运行 pgtune 实用程序以确保您的服务器配置是合理的
  • 删除此表上一些不必要的索引
  • 改进磁盘子系统,例如安装 SSD
  • 添加内存

至于缺少 id - 如果某些插入事务因任何原因(包括客户端突然关闭连接)回滚,就会发生这种情况。

这是否正常很难说 - 取决于您的工作流程。但是您不应该尝试回收丢失的 id - 在事务数据库中这根本不值得。

【讨论】:

  • 将数据刷新到磁盘与“查看”来自 SQL 的数据无关。
  • 如果他的插入率高于磁盘流速度,服务器将崩溃并且很难响应大多数查询
  • 插入(或提交)可能需要一些时间才能成功。但是如果提交通过了,结果对其他人可见,即使数据没有被物理写入磁盘
  • @a_horse_with_no_name:如果提交通过,数据将物理写入磁盘。如果不是这样,就不能叫commit(除非你玩危险,设置fsync=off)
猜你喜欢
  • 1970-01-01
  • 2018-06-06
  • 1970-01-01
  • 2011-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-24
  • 2020-12-05
相关资源
最近更新 更多