2007年07月17日
all_rows/first_rows/first_rows(n)的筆記
網友的實際測試
http://yangtingkun.itpub.net/post/468/228323
http://yangtingkun.itpub.net/post/468/228323
1.FIRST_ROWS : 主要用於web網站,把第一筆找到的資料回傳(同時oracle還在繼續尋找其他符合條件的紀錄)
2.FIRST_ROWS(n) : 作用跟first_rows相同,但只是回傳的是達到指定的數量後,再行先回傳(n 必須是,1,10,100,1000,....)
3.ALL_ROWS 是oracle綜合考慮把所有結果記錄集通過最快的路徑找到,後然後把所有結果集一次返回給請求。追求的是最大i/o吞吐量。
first_rows,first_rows(n) 的比較是1返回結果的反應快,因為他們追求的是最短的回應時間(response time)
是所有結果都返回的時間應該超過all_rows需要的時間,因為all_rows追求的是最短的執行時間(execution time)
first_rows傾向於使用索引範圍掃瞄。all_rows傾向於全表掃瞄。
first_rows總的執行時間多大於all_rows的執行時間,但真實情況還是要依羅輯處理的情況而定
ALL_ROWS
選擇Cost_based的方式來優化SQL語句塊。
它從最小化總體的資源消耗的方面考慮優化,也就是達到整體的輸出時間最少。
FIRST_ROWS
選擇Cost_based的方式來優化SQL語句塊。它從最佳反饋時間方面來考慮優化,也就是要求使第一條的記錄返回時間最短。該Hint是優化器有如下選擇:
如果有一個索引可以使用的話,那麼優化器將可能會使用索引代替全表掃瞄。
如果有一個索引可以使用的話,那麼優化器將可能會在對於一個NESTED LOOPS操作中關聯到一個相關的INNER表時,使用NESTED LOOPS JOIN代替SORT-MERGE JOIN操作。
如果有一個索引可以使用的話,那麼優化器將可能會使用它來在一個ORDER BY操作中避免產生一個SORT操作。
該Hint在什麼情況下會被忽略:
在UPDATE或者DELETE語句中會被忽略
在下列的SELECT語句中該Hint也會被忽略:數據集操作(UNION,INTERSECT,MINUS,UNION ALL),GROUP BY子句,FOR UPDATE子句,GROUP函數,DISTINCT操作。由於上述操作都需要對全部的數據進行檢索,同該Hint的作用(以最短的時間返回第一條記錄) 相衝突。
FIRST_ROWS 優化模式會很快返回第一條數據,在表連接上傾向於使用nestloop
nestloop:他主要是一筆一筆的比對,較省記憶体,但較多的i/o
ALL_ROWS 會把返回第一條數據較慢,在表連接上傾向於使用hash join
hash join:會把table全load到記憶体中,然後對資料做hash code處理,然後再比對,如資料量較小的話,整体時間會快很多
如table的資料量較大的話,就要看大到什情況了
官方文件:
http://download.oracle.com/docs/cd/B10501_01/server.920/a96533/optimops.htm#51613
http://download.oracle.com/docs/cd/B10501_01/server.920/a96533/hintsref.htm#4924
引用URL
http://cgi.blog.roodo.com/trackback/3674005