在带有postgres的Django中,切片查询的update性能不佳-有更好的解决方案吗?

问题描述

我正在使用Postgresql 12和Django 3作为ORM

当我使用update()一次更新许多数据库行时,我注意到查询性能下降

示例应用程序来说明:

  • 需要由预订系统预订商品,当商品可用时,其状态为值“ A”,而当商品为“ R”时。
  • 大量预订(一次最多可预订1000到十万个项目)。

Django片段(请注意,由于已被切片,因此我无法直接在queryset上使用update):

with transaction.atomic():
    items = Item.objects.select_for_update().filter(status='A')[:1000]      
    Item.objects.filter(pk__in=items).update(requester=r,status='R')
               

生成以下查询,最多需要 4秒在我的测试环境上执行,以(仅)更新1000个项目(更新1M个项目需要1小时以上的时间)。

UPDATE "item"
   SET "requester_id" = 16,"status" = 'R'
 WHERE "item"."id" IN (
        SELECT U0."id"
          FROM "item" U0
         WHERE U0."status" = 'A'
         LIMIT 1000
           FOR UPDATE
       )

我想知道是否有更好的方法解决此问题,对提高性能有何建议? (除了优化硬件和异步/并行执行之外。)

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)