2016-11-11 37 views
1

我正在解决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%,但仍然是现在好了足够。

+0

但真正的问题是:如果你能通过连接获得正确的'admin_Id',那么为什么要更新'posts'表呢?只要你需要它,就加入它。 –

+0

哇。我觉得自己像个白痴。您的解决方案奏效我根本不需要组,我根本不需要子查询。如果你回答这个问题,我会选择你的答案。 – tambykojak

回答

1

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

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