某 jBPM 歷史表清理存儲過程,使用 7 層游標巢狀循環(RBAR 模式)刪除 10 萬~百萬條關聯數據,執行極慢(數小時)。本文分析性能瓶頸,提供分批集合操作、臨時表、外部調度等優化方案。
方案 核心思想 預期提升 實施難度 1. 分批集合刪除(推薦) 將巢狀邏輯改寫為多條 DELETE ... WHERE id IN (SELECT ...)或JOIN,每批 1000-5000 行,提交事務100-1000x 中(需重寫邏輯) 2. 臨時表中轉 先 CREATE TEMPORARY TABLE tmp_ids SELECT id FROM ... WHERE 清理條件,再DELETE t FROM target JOIN tmp_ids ON ...50-200x 低 3. 外部調度 + 分塊 應用層/Python 腳本分塊 ID 範圍,並行提交 DELETE ... WHERE id BETWEEN ? AND ?200-500x 中(需外部依賴) 4. 分區表 + DROP PARTITION 按時間範圍分區,清理直接 ALTER TABLE DROP PARTITION(元數據操作,秒級)∞ (架構變更) 高(需重建表) 5. pt-archiver Percona Toolkit 專業歸檔工具,分塊、暫停、檢查從庫延遲、可導出文件 專業級 低(安裝即用) 方案 1 實戰改寫示範(分批集合刪除)