oracle大表效能最佳化

追求完美9196發表於2024-07-24

1 不修改表結構的最佳化

1.1 收縮表,降低高水位線

ALTER TABLE TEST ENABLE ROW MOVEMENT;
ALTER TABLE TEST SHRINK SPACE;

1.2 對錶收集統計資訊

BEGIN
DBMS_STATS.GATHER_TABLE_STATS(ownname => user,
tabname => 'TEST');
END;

1.3 使用oracle的並行查詢功能

SELECT /*+ parallel(4)*/* FROM test;

1.4 OR查詢條件使用union all替代

1.5 多表聯合查詢時,在子查詢中先寫好過濾條件再關聯別的表

1.6 DML比較慢時而且併發訪問比較低的情況下,會話開啟並行DML功能。

Alter session enable parallel dml;

1.7 在insert時使用直接載入和nologging方式插入資料

Insert /*+ append parallel(4)*/ into test nologging select * from YYY;

1.8 update大量資料時,可以使用先刪除後插入的做法代替

2 修改表結構的最佳化

2.1 在篩選(where)少部分資料的欄位上建立索引

2.2 如果查詢(select)或者排序(order by)涉及的欄位很少,可以在這些欄位建立索引

2.3 如果建立了索引,索引沒有生效,查詢索引狀態是否正常。索引為'UNUSABLE'狀態要重建索引

2.4 往目標表插入資料時,可以將索引置為'UNUSABLE'狀態,等插入資料後,再重建索引

alter index IDX_TEST unusable;

2.5 對錶根據業務需求進行分割槽

2.6 儘可能的使用 varchar 代替 char ,因為首先變長欄位儲存空間小,可以節省儲存空間

2.7 涉及LOB欄位型別的表,將LOB欄位放在一個單獨的表空間。因為oracle預設不會快取大於4000位元組的LOB欄位,直接從磁碟讀寫LOB。放在單獨的表空間,從而減少對其他大部分物件的影響

2.8 查詢表的行遷移情況,如果錶行遷移的資料過多,就需要重新建表,同時合適設定PCTFREE,避免更新再次導致行遷移

3 在儲存過程的最佳化

3.1 使用繫結變數的方式輸入變數值

3.2 將大表按使用到的欄位拆分成臨時表(TEMPORARY TABLE)。後面使用臨時表資料而不是大表資料參與計算。臨時表產生的undo資料設定為放在臨時表空間。拆分後,要對臨時表收集統計資訊

--臨時表產生的undo資料設定為放在臨時表空間
ALTER SESSION SET TEMP_UNDO_ENABLED = TRUE;

相關文章