想要做一個資料庫表清理的測驗,清理A表里面不在B表且不C表的資料。這三個表有一個相同的欄位ID做主鍵。我寫了個存盤程序,大概思路是先把要洗掉的資料查詢出來放在游標里,然后打開游標回圈delete A where A.ID =游標變數.ID,每5000條提交一次。這三個表的資料都在3億條左右。想問大家有沒有別的思路?或者用什么方式查詢能最大效率執行查詢這一步?
uj5u.com熱心網友回復:
放游標里面 ,感覺不如放臨時表里面,然后加一個flag欄位,批量洗掉,和更改flag值uj5u.com熱心網友回復:
放游標里的效率不會太高的,臨時表是一個好的方案,做標記洗掉還是可以的。uj5u.com熱心網友回復:
要洗掉的資料量有多少?要保留的資料有多少?如果洗掉的量要比保留的大很多,可以考慮全部洗掉后重新插入的做法
uj5u.com熱心網友回復:
這種大表不能做成磁區表嗎?洗掉磁區效率高很多uj5u.com熱心網友回復:
還是要看b和c表的資料量,如果只是a表量大,b和c較小的話,可用把切割a表進行處理通過不同條件查詢,生成建臨時表,再匯聚
例如
select * from a where not exists (select 1 from b where a.id=b.id) and not exists (select 1 from c where a.id=c.id) and mod(a.id,10)=0;
uj5u.com熱心網友回復:
這個主要是要看是你洗掉的資料量多,還是保留的資料量多。如果保留的資料量少,建議將結果資料寫入一張新表再遷移回來。
原則上不建議對大量資料使用游標,效率會比sql的方式低很多。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/57049.html
標籤:開發
