子查询的更新表执行速度很慢

时间:2016-11-11 21:57:03

标签: sql postgresql postgresql-performance

我很难解决SQL问题。我已经搜索过互联网,但未能找到解决方案。

我在下面提供了一些背景信息。我只包括了我认为相关的内容。

现有表:

Group
id - has index

Admin
id - has index

Post
id - has index
group_id - has index
admin_id - has index

我的问题:

在创建帖子时,软件中曾经存在一个未填充admin_id列的错误。这没关系,因为到目前为止,假设每个组只有一个管理员。

我们现在正在添加为每个组设置多个管理员的功能,因此需要填充admin_id。软件中的错误已得到修复,但我们必须返回并为每个帖子填充admin_id

我的解决方案/问题:

我做错了什么?以下是我的查询。它需要45分钟才能运行。我找不到解决这个问题的方法。如果它需要,我可以花45分钟,但是我真的很讨厌它,我很想找到一种有效的方法来用SQL做这件事。

UPDATE posts
SET admin_id = X.admin_id
    FROM (
        SELECT
            posts.group_id,
            admins_groups.admin_id
        FROM posts
        JOIN groups ON posts.group_id = groups.id
        JOIN admins_groups ON groups.id = admins_groups.group_id
    ) AS X
WHERE posts.group_id = X.group_id;

到目前为止我尝试了什么。

除了搜索互联网并失败之外......

我读到索引使写入速度变慢,所以我删除了posts.admin_id上的索引并且已经看到了20%的性能提升,但现在仍然足够好。

1 个答案:

答案 0 :(得分:1)

据我所知,您不需要groups表,也不应该在FROM子句中重复更新的目标表:

UPDATE posts 
    SET admin_id = admins_groups.admin_id 
FROM admin_groups 
WHERE posts.group_id = admins_groups.group_id