1 避免無計畫的全表掃瞄
如下情況進行全表掃瞄:
- 該錶無索引
- 對返回的行無人和限制條件(無where子句)
- 對於索引主列(索引的第一列)無限制條件
- 對索引主列的條件含在表示式中
- 對索引主列的限制條件是is (not) null或!=
- 對索引主列的限制條件是like操作且值是乙個bind variable或%打頭的值
2 只使用選擇性索引
索引的選擇性是指索引列中不同值得數目和標誌中記錄數的比,選擇性最好的是非空列的唯一索引為1.0。
復合索引中列的次序的問題:
1 在限定條件裡最頻繁使用的列應該是主列
2 最具有選擇性的列(即最清晰的列)應該是主列
如果1和2 不一致,可以考慮建立多個索引。
在復合索引和多個單個索引中作選擇:
考慮選擇性 考慮讀取索引的次數 考慮and-equal操作
3 管理多表連線(nested loops, merge joins和hash joins) 優化聯接操作
merge joins是集合操作 nested loops和hash joins是記錄操作返回第一批記錄迅速
merge joins的操作適用於批處理操作,巨大表 和遠端查詢
1全表掃瞄 --〉 2排序 --〉3比較和合併 效能開銷主要在前兩步
適用全表掃瞄的情形,都適用merge joins操作(比nested loops有效)。
改善1的效率: 優化i/o, 提高使用oracle多塊讀的能力, 使用並行查詢的選項
改善1的效率:提高sort_area_size的值, 使用sort direct writes,為臨時段提供專用表空間
4 管理包含檢視的sql語句
優化器執行包含檢視的sql語句有兩種方法:
- 先執行檢視,完成全部的結果集,然後用其餘的查詢條件作過濾器執行查詢
- 將視**本整合到查詢裡去
含有group by子句的檢視不能被整合到乙個大的查詢中去。
在檢視中使用union,不阻止檢視的sql整合到查詢的語法中去。
5 優化子查詢
6 使用復合keys/star查詢
7 恰當地索引connect by操作
8 限制對遠端表的訪問
9 管理非常巨大的表的訪問
- 管理資料接近(proximity) 記錄在表中的存放按對錶的範圍掃瞄中最長使用的列排序 按次序儲存資料有助於範圍掃瞄,尤其是對大表。
- 避免沒有幫助的索引掃瞄 當返回的資料集合較大時,使用索引對sga的資料塊快取占用較大,影響其他使用者;全表掃瞄還能從oracle的多塊讀取機制和「一致性獲取/每塊」特性中受益。
- 建立充分索引的表 使訪問索引能夠讀取較全面的資料 建立僅主列不同的多個索引
- 建立hash簇
- 建立分割表和檢視
- 使用並行選項
10 使用union all 而不是union
union all操作不包括sort unique操作,第一行檢索的響應速度快,多數情況下不用臨時段完成操作,
union all建立的檢視用在查詢裡可以整合到查詢的語法中去,提高效率
11 避免在sql裡使用pl/sql功能呼叫
12 繫結變數(bind variable)的使用管理
使用bind variable和execute using方式
將like :name ||』%』 改寫成 between :name and :name || char(225), 已避免進行全表掃瞄,而是使用索引。
13 回訪優化程序
資料變化後,重新考察優化情況
SQL調優之八 關於SQL調優
sql調優是指對未達到預期的sql語句進行診斷和修復 sql調優是乙個反覆的過程,是一步一步的將sql語句的效能提公升到預期的目標。它是對乙個已經實施完成了的應用的問題的解決,相反的,應用設計則是在實施之前,就應該已經設定好了安全和效能的目標。一次典型的調優過程,需要達到以下的其中乙個目的 相對的,...
SQL調優命令
命令工具 oracle sql plus 或者cmd sqlplus mmsuser agooy8tt xian 133 64 46 26 是 set autotrace off 不產生autotrace報告,預設設定,查詢按常規執行。set autotrace on statistics 查詢按常...
sql效能調優
基本原則 1.避免全表搜尋 2.建立索引 3.盡量避免向客戶端返回大量資料,若資料量大,考慮要求是否合理 4.盡量避免大事務操作,提高系統併發能力 5.盡量避免使用游標,因為效率差 關於where條件 1.盡量避免在where條件使用!或 操作符,否則引擎將放棄使用索引而全表搜尋 2.盡量避免在wh...