某系統擁有一張超過 2 億筆資料的大表,並建立 4 個獨立索引。業務需求每日兩次各插入 300 萬筆資料,單次耗時超過 3 小時,嚴重影響效能。為改善狀況,團隊調整策略:每日 TRUNCATE 該表後僅保留當日新增資料(約 300 萬筆)。
| 資料量 | UPDATE 耗時 |
|---|---|
| 2 億+ 筆 | 59 秒 |
| 300 萬筆 | 數小時 |
咨詢 DBA 後建議重建索引,重建後耗時縮減至 6 秒。然而第三天問題再次發生,DBA 亦無法給出合理解釋,推測與 Oracle 複雜的查詢優化器演算法有關。
DBA 給出的標準化作業流程如下:
TRUNCATE TABLE ...;
DROP INDEX ...;
INSERT DATA ...;
CREATE INDEX ...;
ANALYZE TABLE table_name COMPUTE STATISTICS;
執行上述流程後,整體操作耗時大幅降低並穩定。
TRUNCATE → DROP INDEX → LOAD → CREATE INDEX → GATHER STATS 納入排程作業,避免人為疏漏。DBMS_STATS.GATHER_TABLE_STATS,功能更完整、支援並行與增量統計。TRUNCATE PARTITION 可避免全域索引失效問題。