2016-09-16 306 views
0

我有通知表(非常大的表),我需要用下面的場景你的幫助最佳SQL解決方案?

1選擇用戶ID的所有通知
2-在notification_log表中插入這些通知 3-中刪除所有這些通知通知表

我的想法:

1在通知表創建標誌列,並創建更新觸發器在它做在上面的場景步驟2和3。

抽獎背上:觸發共謀O(n)和我總是選擇散裝的通知,所以這將是不好聽的性能

2 - 創建簡單的SQL過程做上述情況下

Draw Backs:如果該腳本的步驟未能完成整個過程,將會回滾

如果能夠幫助我優化這一點,該怎麼辦?

在此先感謝

+0

您可以只有兩個單獨的查詢,第一個選擇所有未登錄到日誌的通知,第二個刪除日誌中的所有通知。至少你這樣使用索引來表現。此外,它永遠不會刪除它已有的任何東西。 –

回答

1

沒有太多,可能會失敗INSERT ... SELECT ...; DELETE ...;,所以我肯定會與存儲過程中去。

此外,還有一些選項,使整個過程更快(臨時刪除索引和約束,等等),但是這不是你問:-)

+0

我的目標是提高性能,但如何在沒有索引的情況下過程更快? –

+1

因爲INSERT和DELETE會創建重建索引的需要。如果您一次移動大量數據,可能會更好地刪除索引,移動數據並重新創建索引。數據操作本身將變得更快。 –

+1

'INSERT'和'DELETE'創建'更新'索引的需要。在重建大表上的索引時,可能會比在幾千個字段中更新索引更多的開銷! – deroby

0

我想你應該用簡單的程序走的。

以下是您應遵循的步驟。

1)在通知表中的user_id上創建索引。 2)用光標寫程序。 3)收集遊標中的所有user_id並迭代。 4)從光標中的user_id通知中選擇所有行。 5)在notification_log表中插入這些行。 6)從通知欄中刪除插入的列。

注意: - 在成功執行過程後,不要在notification_log表上添加任何外鍵或索引,然後添加所需的外鍵和索引。