SQL 優化
- 使用where子句過濾行
- 使用表連接而不是多個查詢
- 執行連接時使用完全限定的列引用
- 使用case表達式而不是多個查詢
- 添加表索引
當單個查詢的行數小於等於表總行數的10%時,建立b-樹索引
對於包含小範圍值且在查詢的where子句中頻繁使用的列,應使用位圖索引 - 使用where並不是having
- 使用union all而不是使用union
因爲union要刪除重複的行,索引儘量使用union all而不是使用union - 使用exists而不是in
exists只檢查行的存在性,而in檢查實際的值。所以通常情況下exists性能比in的性能好 - 使用exists而不是distinct
因爲distinct在排除重複行之前要對檢索到的行排序 - 使用grouping sets而不是cube
一般情況下:grouping sets比cube性能好 - 使用綁定變量
oracle會緩存已經執行的sql語句;如果以後執行相同的語句,就重用緩存的sql語句。
重用緩存的sql語句,sql語句必須完全相同,包括:
sql語句中的所有字符必須相同
sql語句中所有字母的大小寫必須相同
sql語句中所有空格必須相同
使用綁定變量定義相同的sql語句
variable v_test_id number
begin
:v_test_id := 1;
end;
select * from test where id = :v_test_id;
- 比較執行查詢的成本
oracle數據庫軟件使用稱爲優化器的子系統,生成訪問表中存儲數據的最有效路徑。優化器生成的路徑稱爲執行計劃。
1>檢查執行計劃description
describe plan_table
如果有類似的表,那麼就是有計劃表,否則就要創建表
2>創建計劃表
3>生成執行計劃
語法:
explain plan set statement_id = statement_id for sql_statement;
4>查詢計劃表
5>表連接的執行計劃
explain plan set statement_id = '*****' for
6>收集表統計信息
analyze table test compute statictics;
- 優化器傳遞提示
explain plan set statement_id = 'hint' for
select /*+ first_rows(2) */ t.id,t.year
from test
where id = 1;