Oracle 提供三種優化器模式:
透過 init.ora 的 OPTIMIZER_MODE 設定預設值(RULE、COST、CHOOSE、ALL_ROWS、FIRST_ROWS),亦可在 SQL 或 Session 層級覆蓋(/*+ RULE */、ALTER SESSION SET OPTIMIZER_MODE=...)。
建議:預設
CHOOSE易導致非預期全表掃描,生產環境宜明確指定ALL_ROWS(吞吐量優先)或FIRST_ROWS_n(回應時間優先),並定期執行DBMS_STATS.GATHER_SCHEMA_STATS維護統計資訊。
| 方式 | 說明 | 適用場景 |
|---|---|---|
| 全表掃描 | 循序讀取所有區塊,支援多區塊讀取 | 小表、大比例資料存取、無合適索引 |
| ROWID 存取 | 透過索引取得 ROWID 再定位資料 | 高選擇性查詢、索引範圍掃描 |
索引建立在高選擇性欄位上,可將 ROWID 快速定位轉化為效能優勢。避免在低選擇性欄位(如性別、狀態碼)建立單欄索引。
Oracle 將解析後的 SQL 存放於 SGA 共享池,所有 Session 可重用。若新 SQL 與現有完全相同(含大小寫、空白、換行),即可共享執行計畫,減少解析開銷。
SELECT * FROM EMP; 與 select * from emp; 視為不同。sal_limit,User B 用公有同義詞同名物件,雖名稱相同但物件不同,無法共享。:blk1.pin 與 :blk1.ot_ind 即使執行時值相同,也不共享。V$SQLAREA、V$SQL_SHARED_CURSOR 找出不共享原因。SHARED_POOL_SIZE,但避免過大導致管理開銷。