如何確定oracle驅動表?
Oracle要選擇驅動表,需要明確表的連接方式,針對不同的連接方式,驅動表的選擇邏輯有差異:
一:NESTED LOOPS(嵌套循環)
針對NL的驅動表,是執行計劃中離NESTED LOOPS最近的表為驅動表。如下圖
通過上圖,可以看到EMP是驅動表。
NL下,驅動表選擇的是兩個關聯表中返回行數最少的那個。
二:HASH JOIN(哈希連接)
針對HJ的驅動表,是執行計劃中離HASH JOIN最近的表為驅動表。如下圖
上圖可以看到,DEPT離HASH JOIN關鍵字最近,表示DEPT是驅動表。
HJ下,同樣是選擇小表作為驅動表,但是這里的小表不同于NL的行數少,而是指的是 行數*列寬度。
注:要想讓oracle選擇好正確的驅動表,選擇好正確的執行計劃,必須要確保Oracle數據庫中表的統計信息是準確的。針對某個具體的Sql如何確定引用表的統計信息是否準確呢?可以通過如下腳本來核實。
select owner, table_name name, object_type, stale_stats, last_analyzed
from dba_tab_statistics
where table_name in ('表名')
and owner = '表的所有者';
希望對題主有所幫助。