ORACLE進階之一:HINT

xccheese發表於2012-02-10
最近由於需要經常統計資料,需要經常用到hint,又不好意思每次都去麻煩DBA,所以在與DBA交流之後,整理了一份關於我們寫ORACLE SQL語句時最常用到的hint使用方法:
另外,我們以前的流程都是等應用釋出之前,統一提交DBA check,然後再由開發人員修改;
但是如果我們開發人員在寫這些語句的時候可以知道這些hint的常規用法,這樣在和dba check的時候會大大降低返工率,而且不止會知其然,還會知其所以然
呵呵,何樂而不為呢!
hint中我們最常用到的有ordered、use_nl、use_hash、index、full這五種;
下面就介紹下這5種hint適用的主要場合:
1)use_nl主要用於在多表join的時候,nl的意思是nest loop,就是巢狀查詢;
         規則為,根據引數中指定表名的順序,根據where子句中的查詢條件把所有記錄都查出來,然後再迴圈這些記錄與另外的表join;
         適應場合為:某表的查詢結果集很小,而其他表的查詢結果集很大;
         比如:select a.* from table1 a,table2 b where a.xx='1' and b.yy = '2' and a.x=b.x
         若根據a.xx='1'從table1中查詢出來的結果集比根據b.yy = '2'從table2中查詢出來的結果集小得多,則可以加上use_nl(a b);
         使用的時候將小結果集放前面,大結果集放後面;
2)use_hash可以看作是use_nl的兄弟,也是用於在多表join的時候,但是他不使用巢狀,而是用hash join;
         其規則和use_nl完全一樣;
         適應場合為:各表的查詢結果集都比較大,而且大小差不多
         比如:select a.* from table1 a,table2 b where a.xx='1' and b.yy = '2' and a.x=b.x
         若根據a.xx='1'從table1中查詢出來的結果集和根據b.yy = '2'從table2中查詢出來的結果集都比較大,而且大小差不多,則可以加上use_hash(a b);
3)ordered用於強制指定DB按照FROM子句中各表的先後順序進行資料查詢;
         比如說SELECT A.* FROM TABLE1 A, TABLE2 B WHERE A.X=B.X ……中新增了/*+ORDERED */,則標識oracle會強制先查詢table1中的記錄,然後再與table2 join;
         一般來說這個hint都是與use_nl和use_hash聯合使用的;
         比如1)中的語句可以為select /*+ORDERED use_nl(a b) */ a.* from table1 a,table2 b where a.xx='1' and b.yy = '2' and a.x=b.x
4)index主要用於強制指定使用某個索引,一般選擇效率更高的索引;
         適應場合為:where子句中有幾個索引可供選擇、或者是用到了聯合索引中的第一個欄位;
         比如select a.* from table1 where column1 = 'xx' and column2 = 'yy'
         若table1中column1和column2兩個欄位都有索引,則可以強制指定使用哪個索引,比如index(table1 table1_ind_column1)
5)full用於指定全表掃描,這個實際中應用的較少;
         按照DBA的說法,如果使用index查出來的結果集>=全表記錄的25%,那麼使用index的效率並不高,還不如用全表掃描;

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25148509/viewspace-716033/,如需轉載,請註明出處,否則將追究法律責任。

相關文章