2016-11-11 59 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