Oracle語句優化 個規則詳解 10

2021-04-18 08:49:01 字數 2590 閱讀 1774

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...