1、表連線型別:
nested loops join
hash join
merge sort join
2、表連線的知識點:
表訪問次數、表驅動順序,是否排序,使用限制。
nested loops join:驅動表被訪問0次或1次,被驅動表訪問0次或n次,n由驅動表返回的結果集的條數來定。
與驅動順序有關
無排序無使用限制
hash join :訪問次數:1次或0次
與驅動順序有關
無排序(耗記憶體)
不支援 > 等
merge sort join :訪問次數:1次或0次
與驅動順序無關
有排序支援 > 等
3、 訪問次數
create4、nested loops join 優化table
m1 (
id number
notnull,n
number
,content
varchar(4000))
create
table
m2 (
id number
notnull
,t1_id
number
notnull,n
number
,content
varchar(4000))
insert
into
m1select rownum,rownum,dbms_random.string('
a',50
)from dual connect by
level
<=
100order
bydbms_random.random;
insert
into
m2select rownum,rownum,rownum,dbms_random.string('
a',50
)from dual connect by
level
<=
100000
order
bydbms_random.random;
select
*from m1,m2 where m1.id=
m2.t1_id;
select
/*+ gather_plan_statistics */*
from m1,m2 where m1.id=
m2.t1_id;
select
/*+ leading(m1) use_nl(m2)*/*
from m1,m2 where m1.id=
m2.t1_id;
select
/*+ leading(m1) use_nl(m2)*/*
from m1,m2 where m1.id=m2.t1_id and m1.n in('
2','
18',30
);select
/*+ leading(m1) use_hash(m2) */*
from m1,m2 where m1.id=m2.t1_id
1)確保在olto場景:在大量訪問,且每個訪問的最終返回的記錄很少的場景。
2)驅動表的限制條件要考慮建立索引:
select /*+ leading(m1) use_nl(m2)*/ * from m1,m2 where m1.id=m2.t1_id and m1.n in('2','18',30);
可以建m1表的字段n為索引段,建m2表的字段t1_id為索引段
3)確保小結果集先驅動,大的被驅動。
4)統計資訊收集不準確引發效能瓶頸,預估返回1條,實際返回477k條,預估不準確導致使用nl連線。
5、hash join優化
1)確保用在全掃瞄的olap場景:最終返回的結果記錄比較多
2)明確連線條件是否限制了hash join
3)兩表無任何索引傾向hash join
4)兩表限制條件有索引(看返回量)
5、merge sort join優化
1)確保用在全掃瞄的olap場景:最終返回的結果記錄比較多
2)明確連線條件是否限制了hash join。支援 > 等
3)兩表限制條件有索引(看返回量)
4)避免取多餘列致排序的尺寸太大
Oracle表連線方式之等值連線 外部連線
oracle 8i,9i 表連線方法。一般的相等連線 select from a,b where a.id b.id 這個就屬於內連線。對於外連線 oracle中可以使用 來表示,9i可以使用left right full outer join left outer join 左外關聯 select...
Oracle表連線方式
實用記憶方法 在哪邊,哪邊就是外來鍵,該錶的資料就 少 無 那邊檢索的就是全表資料。oracle 8i,9i 表連線方法。一般的相等連線 select from a,b where a.id b.id 這個就屬於內連線。對於外連線 oracle中可以使用 來表示,9i可以使用left right f...
oracle 表連線方式
一 連線方式 巢狀迴圈 nested loops nl 雜湊 雜湊連線 hash join hj 歸併 排序合併連線 sort merge join smj 二 連線說明 1.oracle一次只能連線兩個表。不管查詢中有多少個表,oracletable 和內部表 inner table 在巢狀迴圈連...