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;