2013-04-06 54 views
3

我有2個表更新查詢服務表現

stock_details(1M +記錄)與領域

billid 

itemid 

groupid 

qty 

stock_details指標index1itemidbillid)和index2itemid

itemmaster (10K +記錄)與字段

itemid 

groupid 

itemmaster有索引index1itemid)和index2groupid

下面的查詢需要幾分鐘才能完成。我不認爲它是正常的。可能只有很少的記錄或零記錄實際得到更新。我想我已經全部到位索引查詢

UPDATE Stock_details A,Db2.ItemMaster B 
SET A.Groupid=B.Groupid 
WHERE A.Itemid=B.itemID AND A.Groupid<>B.GroupId 

然的選擇查詢

EXPLAIN SELECT A.groupid FROM Stock_details A,db2.ItemMaster B 
WHERE A.Itemid=B.itemID AND A.Groupid<>B.GroupId 

的解釋,其結果是在這裏 http://i.imgur.com/IR5iWX7.png

回答

1

的的「不」部分查詢不能被有效地索引,因此每一行都必須被掃描。

我想這是你必須定期運行的東西(否則你不會在意需要多長時間)。有一件事你可以跟蹤上次運行的時間,並且只考慮從那時起更新的行。

+0

它沒有定期運行。但在我的應用程序中有一個Optimize選項,用於檢查是否有任何數據錯誤(我沒有設置外鍵約束)缺少字段等。它運行時有很多其他查詢。所以這一切都需要很多時間才能完成。有沒有其他方法可以重新編寫此查詢? – sjd 2013-04-06 13:35:19

+0

我認爲答案是否定的。但是如果你願意在這個查詢之外看看,那麼你可以做些什麼。例如,同時更新兩個表中的組ID,因此您不需要此檢查。按照我的建議跟蹤一些時間戳,以便使檢查更加高效(當然,您必須添加一個字段和一個索引,但跟蹤創建/更新時間非常標準 - 無論如何,您幾乎總是應該這樣做。 – 2013-04-06 16:08:41

+0

明白了,實際上錯配的機會是微乎其微的,我可以給時間戳一個嘗試,因爲它已經存在於表格中,謝謝 – sjd 2013-04-09 08:01:04

1

我不知道。但試試這個,看看...

1)的itemid和組ID togethewr指數可能有助於

2)

UPDATE (選擇A.Groupid ,B.Groupid作爲組識別符號從 Stock_details A,Db2.ItemMaster乙 WHERE A.Itemid = B.itemID AND A.Groupid <> B.GroupId)K 組k.Groupid = k.Groupids

+0

由於股票表是非常強烈的插入,我想減少那裏的指數, Groupid到index2爲(itemid,groupid)在select查詢中取得了很好的進展,但在更新查詢中卻沒有.i仍然可以使用它,我想通過使用臨時表。謝謝。上述更新查詢似乎不工作。它說「UPDATE的目標表k不可更新」。 – sjd 2013-04-06 14:05:24