42. 使用提示(hints) 對於表的訪問,可以使用兩種hints.
full 和 rowid
full hint 告訴oracle使用全表掃瞄的方式訪問指定表。
例如:select /*+ full(emp) */ *
from emp
where empno = 7893;
rowid hint 告訴oracle使用table access by rowid的操作訪問表。
通常, 你需要採用table access by rowid的方式特別是當訪問大表的時候, 使用這種方式, 你需要知道roiwd的值或者使用索引。
如果乙個大表沒有被設定為快取(cached)表而你希望它的資料在查詢結束是仍然停留在sga中,你就可以使用cache hint 來告訴優化器把資料保留在sga中。 通常cache hint 和 full hint 一起使用。
例如:select /*+ full(worker) cache(worker)*/ *
from work;
索引hint 告訴oracle使用基於索引的掃瞄方式。 你不必說明具體的索引名稱
例如:select /*+ index(lodging) */ lodging
from lodging where manager = 『bill gates』;
在不使用hint的情況下, 以上的查詢應該也會使用索引,然而,如果該索引的重複值過多而你的優化器是cbo, 優化器就可能忽略索引。 在這種情況下, 你可以用index hint強制oracle使用該索引。
oracle hints 還包括all_rows, first_rows, rule,use_nl, use_merge, use_hash 等等。
譯者按:使用hint , 表示我們對oracle優化器預設的執行路徑不滿意,需要手工修改。這是乙個很有技巧性的工作。 我建議只針對特定的,少數的sql進行hint的優化。對oracle的優化器還是要有信心(特別是cbo)
43. 用where替代order by
order by 子句只在兩種嚴格的條件下使用索引。
order by中所有的列必須包含在相同的索引中並保持在索引中的排列順序。
order by中所有的列必須定義為非空。
where子句使用的索引和order by子句中所使用的索引不能並列。
例如:表dept包含以下列:
dept_code pk not null
dept_desc not null
dept_type null
非唯一性的索引(dept_type)
低效: (索引不被使用)
select dept_code
from dept
order by dept_type
explain plan:
sort order by
table access full
高效: (使用索引)
select dept_code
from dept
where dept_type > 0
explain plan:
table access by rowid on emp
index range scan on dept_idx
譯者按:order by 也能使用索引! 這的確是個容易被忽視的知識點。 我們來驗證一下:
sql> select * from emp order by empno;
execution plan
0 select statement optimizer=choose
1 0 table access (by index rowid) of 'emp'
2 1 index (full scan) of 'empno' (unique)
44. 避免改變索引列的型別。
當比較不同資料型別的資料時, oracle自動對列進行簡單的型別轉換。
假設 empno是乙個數值型別的索引列。
select …
from emp
where empno = 『123』
實際上,經過oracle型別轉換, 語句轉化為:
select …
from emp
where empno = to_number(『123』)
幸運的是,型別轉換沒有發生在索引列上,索引的用途沒有被改變。
現在,假設emp_type是乙個字元型別的索引列。
select …
from emp where emp_type = 123
這個語句被oracle轉換為:
select …
from emp
where to_number(emp_type)=123
因為內部發生的型別轉換, 這個索引將不會被用到!
譯者按:為了避免oracle對你的sql進行隱式的型別轉換, 最好把型別轉換用顯式表現出來。 注意當字元和數值比較時, oracle會優先轉換數值型別到字元型別。
Oracle語句優化 個規則詳解
1.選用適合的oracle優化器 2.訪問table的方式oracle 採用兩種訪問表中記錄的方式 3.共享sql語句 4.選擇最有效率的表名順序 只在基於規則的優化器中有效 5.where子句中的連線順序。6.select子句中避免使用 7.減少訪問資料庫的次數 8.使用decode函式來減少處理...
Oracle語句優化 個規則詳解 11
45.需要當心的where子句 某些select 語句中的where子句不使用索引。這裡有一些例子。在下面的例子裡,將不使用索引。記住,索引只能告訴你什麼存在於表中,而不能告訴你什麼不存在於表中。不使用索引 select account name from transaction where amo...
oracle語句優化規則二
oracle採用自下而上的順序解析where子句,根據這個原理,表之間的連線必須寫在其他where條件之前,那些可以過濾掉最大數量記錄的條件必須寫在where子句的末尾。1.where子句中的連線順序。oracle採用自下而上的順序解析where子句,根據這個原理,表之間的連線必須寫在其他where...