Oracle中表的連線型別

2022-08-10 05:27:10 字數 4287 閱讀 3246

oracle中所謂表的連線,有兩種含義。一種是根據oracle內部的連線判斷方式區分的內部連線型別,這會影響到系統優化、資源占用等問題。另一種是基於查詢的方式,對兩張表之間建立聯絡,會影響到查詢的結果,這裡都寫一下。

一、oracle 中的表內部連線有 3類 :

1、巢狀迴圈連線( nested loops)

原理:掃瞄乙個表,每讀取驅動表的一條記錄,就根據索引去另乙個表裡面查詢,所有匹配記錄放在結果集中,然後再讀取驅動表的下一行。沒有索引一般就不會是 nested loops 。

條件:驅動表結果集不大,被驅動表連線欄位要有索引。

特點:使用巢狀迴圈連線是從連線結果中提取第一批記錄的最快速方法。

使用: use_nl(t1 t2) 提示來強制執行 nested loops 。

2、雜湊連線( hash join)

原理:優化器先掃瞄小表,根據連線鍵在記憶體中建立 hash 表,然後掃瞄大表,每得到一條記錄就探測 hash 表一次,找出匹配行。

條件:兩個巨大表之間的連線,或乙個巨大的表乙個小表之間的連線。且連線鍵無索引。

特點:需要較大的記憶體,如錶太大則需要進行分割槽,並暫時儲存至磁碟的臨時段。掃瞄成本 = 全表掃瞄大表 + 分割槽數 * 表全表掃瞄小表;還需要注意的是:必須將 hash_join_enabled 設為 true, 並且為引數 pga_aggregate_target 設定了乙個足夠大的值後,才可以執行 hash join 。

使用: use_hash(t1 t2) 提示來強制執行 hash join

3、排序合併連線( sort merge join)

原理:將兩個表分別進行排序,然後將兩個表合併,查詢出匹配的記錄。

條件:行源已經被排過序的情況下使用。

特點:主要花費在兩個表的全表掃瞄和各自的排序上。

使用: use_merge(t1 t2) 提示來強制執行 sort merge join 。

總結:當缺少有用的索引時,雜湊連線比巢狀迴圈連線更加有效。雜湊連線可能比排序合併連線更快,因為在這種情況下只有一張源表需要排序。雜湊連線也可能比巢狀迴圈連線更快,因為處理記憶體中的雜湊錶比檢索 b_tree 索引更加迅速。

二、oracle外部連線方式也分3類:

sql> select * from t11;

c1         c2

---------- ----------

5          5

1          1

2          2

sql> select * from t22;

d1         d2

---------- ----------

1          1

2          2

3          3

4          4

1、內連線(inner join)

sql> select c1,c2,d1,d2 from t11 inner join t22 on t11.c1=t22.d1;

等效於:(可簡寫為join)

sql> select c1,c2,d1,d2 from t11,t22 where t11.c1=t22.d1;

效果:c1         c2         d1         d2

---------- ---------- ---------- ----------

1          1          1          1

2          2          2          2

2、外連線(outer join)

①左外連線

sql> select c1,c2,d1,d2 from t11 left outer join t22 on t11.c1=t22.d1;

等效於:(可簡寫為left join)

sql> select c1,c2,d1,d2 from t11,t22 where t11.c1=t22.d1(+);

效果:c1         c2         d1         d2

---------- ---------- ---------- ----------

5          5

1          1          1          1

2          2          2          2

②右外連線

sql> select c1,c2,d1,d2 from t11 right outer join t22 on t11.c1=t22.d1;

等效於:(可簡寫為right join)

sql> select c1,c2,d1,d2 from t11,t22 where t11.c1(+)=t22.d1;

效果:c1         c2         d1         d2

---------- ---------- ---------- ----------

1          1          1          1

2          2          2          2

4          4

3          3

③全外連線

sql> select c1,c2,d1,d2 from t11 full outer join t22 on t11.c1=t22.d1;

效果:c1         c2         d1         d2

---------- ---------- ---------- ----------

5          5

1          1          1          1

2          2          2          2

4          4

3          3

等效於:(可簡寫為full join)

sql> select c1,c2,d1,d2 from t11,t22 where t11.c1=t22.d1(+)

2  union

3  select c1,c2,d1,d2 from t11,t22 where t11.c1(+)=t22.d1;

3、交叉連線(cross join)

sql> select c1,c2,d1,d2 from t11 cross join t22;

等效於:(其他join必須有on子句)

sql> select c1,c2,d1,d2 from t11,t22;

效果:c1         c2         d1         d2

---------- ---------- ---------- ----------

5          5          1          1

5          5          2          2

5          5          3          3

5          5          4          4

1          1          1          1

1          1          2          2

1          1          3          3

1          1          4          4

2          2          1          1

2          2          2          2

2          2          3          3

2          2          4          4

12 rows selected.

Oracle中表連線的執行原理

oracle優化器會自動選擇以下三種方式的一種執行表連線,但在資料環境上配合強化選擇合適的方式或強制使用某種方式是sql優化的需要 nested loop 對於被連線的資料子集較小的情況,nested loop連線是個較好的選擇。nested loop就是掃瞄乙個表,每讀到一條記錄,就根據索引去另乙...

Oracle中表連線的執行原理

oracle優化器會自動選擇以下三種方式的一種執行表連線,但在資料環境上配合強化選擇合適的方式或強制使用某種方式是sql優化的需要 nested loop 對於被連線的資料子集較小的情況,nested loop連線是個較好的選擇。nested loop就是掃瞄乙個表,每讀到一條記錄,就根據索引去另乙...

SQL中表的連線,LINQTOSQL中表的連線

表的連線分為,內連線與外連線。外連線分為左外連線,右外連線。左連線是已左邊表中的資料為基準,若左表有資料右表沒有資料,則顯示左表中的資料右表中的資料顯示為空 sql 內連線 select from a,b where a.aid b.aid a,b表連線,a,b中均有的資料才顯示 左外連線 sele...