Oracle有很多值得學習的地方,這裡我們主要介紹Oracle驅動表,包括介紹hints的用法等方面。CBO根據統計信息選擇Oracle驅動表,假如沒有統計信息,則在from 子句中從左到右的順序選擇Oracle驅動表。這與RBO選擇的順序正好相反。這是英文原文(CBO determines join order from costs derived from gathered statistics. If there are no stats then CBO chooses the driving order of tables from LEFT to RIGHT in the FROM clause. This is OPPOSITE to the RBO) 。
我還是沒法證實這句話的正確性。不過經過驗證:“如果用ordered 提示(此時肯定用CBO),則以from 子句中按從左到右的順序選擇Oracle驅動表”這句話是正確的。實際上在CBO中,如果有統計數據(即對表與索引進行了分析),則優化器會自動根據cost值決定采用哪種連接類型,並選擇合適的Oracle驅動表,這與where子句中各個限制條件的位置沒有任何關系。如果我們要改變優化器選擇的連接類型或Oracle驅動表,則就需要使用 hints了,具體hints的用法在後面會給予介紹。
如果我創建的3個表:
- create table A(col1 number(4,0),col2 number(4,0), col4 char(30));
- create table B(col1 number(4,0),col3 number(4,0), name_b char(30));
- create table C(col2 number(4,0),col3 number(4,0), name_c char(30));
- create index inx_col12A on a(col1,col2);
執行查詢:
- select A.col4
- from B, A, C
- where B.col3 = 10
- and A.col1 = B.col1
- and A.col2 = C.col2
- and C.col3 = 5;
- Execution Plan