表A id ,usedspace
表B resourceId,filesize
條件 表A.id = 表B.resourceId
符合條件的表B可能有多條資料也可能是0條資料
現在要把 符合條件的表B中的fileSize 更新到 表A的 usedspace欄位中
之前的腳本在幾萬條資料的時候還好用,但是資料一上了幾十萬上百萬的時候就發生死鎖,請問怎么處理啊。這種批量的更新用什么方式效率會高? 小白一個,麻煩大神們多寫點。。
uj5u.com熱心網友回復:
用表 A 的主鍵,分批更新,比如 一次最多 10000 行,更新完了馬上提交一次;再來下一批,直到最后;uj5u.com熱心網友回復:
好好的捋一下業務需求資料越來越多,每次都是全表更新?還是可以部分更新?
更新操作是否可以考慮放在業務空閑是,比如晚上?
uj5u.com熱心網友回復:
還是要從需求著手。更新的頻率要求是什么,多長時間更新一次。
b表的filesize多長時間變化一次。
uj5u.com熱心網友回復:
更新是1天1次,可以在晚上。然后每天都需要全表更新
uj5u.com熱心網友回復:
b表的filesize變化時間不定,只在晚上做一次清算就好了uj5u.com熱心網友回復:
表A的主鍵是系統生成的隨機值,是沒有任何規律的。
這樣的話該如何分批更新呢
uj5u.com熱心網友回復:
可以考慮利用 ROWID從B表批量(一次10000)取值更新A表uj5u.com熱心網友回復:
小白前來學習看樓主的欄位 A表是用戶ID和已用空間 B表是用戶資源ID和檔案大小
每天需要結算用戶當天用了多少空間大小 隔天顯示出用戶已用的空間
業務邏輯是這樣嘛?
我覺得先對B表進行批量分組計算 然后再和A表關聯計算比較合理
因為估計你們用戶也不會有幾百萬 而用戶的操作記錄 即B表幾百萬條吧...
uj5u.com熱心網友回復:
樓主如果使用普通UPDATE更新,建議不要采用,可以使用merge,如果不是生產環境可以建立一個中間表再使用mergeuj5u.com熱心網友回復:
先建一個臨時表t1,將2個表關聯的結果寫入臨時表t1,truncate 源表,才從t1insert回來。uj5u.com熱心網友回復:
不知道你這個陳述句怎么寫的,有沒有考慮使用oracle 的merge語法?
merge into AA
using(select bb.resourceid,bb.filesize from BB) s
on (aa.id = s.resourceid)
when matched then
update set aa.usedspace = s.filesize;
commit;
用merge的話,應該百萬也不至于死鎖吧。速度還挺快的。弄個測驗環境用實際資料測驗下。
uj5u.com熱心網友回復:
這個頂多叫鎖,怎么能說是死鎖呢,死鎖是多個事務產生的uj5u.com熱心網友回復:
11樓的效率貌似挺高轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/115083.html
標籤:開發
