【问题标题】:Performance issue with Django and Postgres on a single update一次更新时 Django 和 Postgres 的性能问题
【发布时间】:2020-09-09 08:16:00
【问题描述】:

更新“

APM 在更新行报告问题,即:

Model.objects.filter(id=model_id).update(field=True)

filter子句使用表的主键,django执行的查询是:

'UPDATE "model" SET "field" = true WHERE "model"."id" = 12345'

由于执行时间超过 5 秒而引发错误。

这段代码在一个 celery 任务中运行,该任务接收模型的 id 作为参数,并且大部分时间都正常执行。

我知道这是一个非常开放的问题,但对于可能发生的事情的任何想法或帮助表示赞赏。

我用完了 Python 3.7、Django 2.0.13 和 Postgres 9.5。

【问题讨论】:

  • 过滤器中涉及的列是否被索引?如果您直接在 Postgres 上运行 query 并在其前面加上 EXPLAIN ,它会返回什么?
  • 我确实使用此信息更新了问题。谢谢。
  • 问题更新可能在某个地方丢失了,因为我看不到有关列索引的信息,也看不到EXPLAIN
  • 您可以启用auto_explain 自动记录EXPLAIN 的慢查询(如果您有很多慢查询,可能会影响性能)。
  • 它可能被锁阻塞了。您可以设置 log_lock_waits 以使其日志锁定等待时间长于 deadlock_timeout。

标签: python python-3.x django postgresql


【解决方案1】:

问题发生是因为我们正在触发任务,但有时它在当前事务提交之前执行,最终锁定。

解决方案是使用 django on_commit hook 如下:

class DoSomethingTask(Task):
    def apply_async(self, *args, **kwargs):
        transaction.on_commit(
            lambda: super(DoSomethingTask, self).apply_async(*args, **kwargs))


@app.task(base=DoSomethingTask,...)
def do_something(tutor_id):
    ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-26
    • 1970-01-01
    • 1970-01-01
    • 2018-12-20
    • 2019-04-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多