Oracle 多表連線

2021-06-29 11:43:06 字數 1596 閱讀 2715

oracle 多表連線

oracle優化器會自動選擇以下三種方式的一種執行表連線,但在資料環境上配合強化選擇合適的方式或強制使用某種方式是sql優化的需要:

nested loop

對於被連線的資料子集較小的情況,nested loop連線是個較好的選擇。nested loop就是掃瞄乙個表,每讀到一條記錄,就根據索引去另乙個表裡面查詢,沒有索引一般就不會是 nested loops。

一般在nested loop中, 驅動表滿足條件結果集不大,被驅動表的連線欄位要有索引,這樣就走nested loop。如果驅動表返回記錄太多,就不適合nested loops了。如果連線字段沒有索引,則適合走hash join,因為不需要索引。

可用ordered提示來改變優化器預設的驅動表,可用use_nl(table_name1 table_name2)提示來強制使用nested loop。

hash join

hash join是優化器做大資料集連線時的常用方式。優化器掃瞄小表(或資料來源),利用連線鍵(也就是根據連線字段計算hash 值)在記憶體中建立hash表,然後掃瞄大表,每讀到一條記錄就來探測hash表一次,找出與hash表匹配的行。

當小表可以全部放入記憶體中,其成本接近全表掃瞄兩個表的成本之和。如果表很大 不能完全放入記憶體,這時優化器會將它分割成若干不同的分割槽,不能放入記憶體的部分就把該分割槽寫入磁碟的臨時段,此時要有較大的臨時段從而盡量提高i/o 的效能。臨時段中的分割槽都需要換進記憶體做hash join。這時候成本接近於全表掃瞄小表+分割槽數*全表掃瞄大表的代價和。

至於兩個表都進行分割槽,其好處是可以使用parallel query,就是多個程序同時對不同的分割槽進行join,然後再合併。但是複雜。

使用hash join時,hash_area_size初始化引數必須足夠的大,如果是9i,oracle建議使用sql工作區自動管理,設定workarea_size_policy 為auto,然後調整pga_aggregate_target即可。

以下條件下hash join可能有優勢:

兩個巨大的表之間的連線。

在乙個巨大的表和乙個小表之間的連線。

可用ordered提示來改變優化預設的驅動表,可用use_hash(table_name1 table_name2)提示來強制使用hash join。

sort merge join

sort merge join的操作通常分三步:對連線的每個表做table access full;對table access full的結果進行排序;進行merge join對排序結果進行合併。sort merge join效能開銷幾乎都在前兩步。一般是在沒有索引的情況下,9i開始已經很少出現了,因為其排序成本高,大多為hash join替代了。

通常情況下hash join的效果都比sort merge join要好,然而如果行源已經被排過序,在執行sort merge join時不需要再排序了,這時sort merge join的效能會優於hash join。

在全表掃瞄比索引範圍掃瞄再通過rowid進行表訪問更可取的情況下,sort merge join會比nested loops效能更佳。

可用use_merge(table_name1 table_name2)提示強制使用sort merge join。

Oracle 多表連線

多表連線 第五章 1.select from emp 1.寫乙個查詢,顯示所有員工姓名,部門編號,部門名稱。select e.ename e.deptno d.dname from emp e,dept d where e.deptno d.deptno select e.ename e.deptn...

oracle多表連線

多表連線 查詢的一種,資料 不再是單一的乙個表,我們可以重多個表中提取相關聯的資料,比如,從emp和dept表中找出人員 所在的部門名稱,多個表來聯合查詢 1.查詢的時候,可以from多個表 select from emp,dept 這樣會產生乙個笛卡爾集 表示 兩個表任何組合的結果 2.需求 取關...

Oracle 多表連線

通過連線條件把相關表關聯起來 select from emp n個表相連會有n 1個關聯關係,先寫關聯條件,再寫限制條件 為什麼會產生笛卡爾積 沒有連線條件會產生笛卡爾積 select emp.ename,emp.empno,dept.deptno,dept.dname from emp,depts...