1. 程式人生 > >oracle 聯結方法

oracle 聯結方法

一般來說,聯結方法分為:巢狀迴圈聯結(Nested Loops),雜湊聯結(Hash-Join),排序合併聯結(Sort Merge Join)以及笛卡爾聯結(Merge Join Cartesian).

1、巢狀迴圈聯結(Nested Loops)

巢狀迴圈有外部表(drivingtable,驅動表)和內部表(inner或driven-to table ,被驅動表)的概念,一般來說,結果集大的成為內部表,結果集小的成為外部表。由外部表(結果集)來驅動內部表。

巢狀迴圈聯結使用一次訪問運算所得的結果集(外部表)中的每一行來與另一個表(內部表)進行對碰。如果結果集的大小是有限的並且在用來聯結的列(inner table 的列)上有索引的話,這種聯結的效率通常是最高的。

簡而言之,這種型別的聯結,如果外部表(結果集)非常小,而內部表(結果集)非常大並且已預先建立索引,那麼巢狀迴圈聯接將特別有效率。

   優缺點:使用記憶體非常小,因為不排序,且資料行集一次只加工一行,所需的開支非常小。也正是這個原因,除了建立一個大資料集所花的時間較長這一點之外,它也是適合進行大資料集加工的。

巢狀迴圈聯結的基本度量是為了準備最終結果集所需要訪問的資料塊數目。

2、排序合併聯結(Sort Merge Join)

內部連線過程:

 1) 首先生成 rowsource1 需要的資料,然後對這些資料按照連線操作關聯列(如 A.col3 )進行排序。

 2) 隨後生成 rowsource2 需要的資料,然後對這些資料按照與 sort source1 對應的連線操作關聯列(如 B.col4 )進行排序。

 3) 最後兩邊已排序的行被放在一起執行合併操作,即將 2 個 row source 按照連線條件連線起來

  下面是連線步驟的圖形表示:

                   MERGE

                /           /

          SORT             SORT

            |                |

   Row Source1          Row Source 2

如果 row source已經在連線關聯列上被排序,則該連線操作就不需要再進行 sort 操作,這樣可以大大提高這種連線操作的連線速度,因為排序是個極其費資源的操作,特別是對於較大的表。預先排序的 row source 包括已經被索引的列(如 a.col3 或 b.col4 上有索引)或 row source 已經在前面的步驟中被排序了。儘管合併兩個 row source 的過程是序列的,但是可以並行訪問這兩個 row source (如並行讀入資料,並行排序)。一旦資料集排序完成了,合併過程是非常快的。

排序合併聯結一般最適合於資料篩選條件有限並返回有限資料行的查詢。若關聯列沒有可用的索引時,排序合併聯結也通常是較好的選擇。

總的來說,在條件為非等值式的時候,排序合併聯結通常是最好的選擇。列如:where table1.col1 between table2.col1 and table2.col2  ,這樣的連線條件就較適合排序合併聯結。(這種情況雜湊聯結是不可能的)

如果資料行源非常大,排序合併聯結就可能是唯一可行的選擇。

3、雜湊聯結(Hash-Join,雜湊聯結)

這種聯結是在 oracle7.3 以後引入的,從理論上來說比 NL(巢狀迴圈) 與 SMJ(排序合併) 更高效,而且只用在 CBO 優化器中。

首先應用where條件的篩選標準來讀取要進行聯結的兩個表,基於表和索引的統計資訊,確定小的結果集並完全雜湊化到記憶體中。這個散列表包含了源結果集的所有資料行,並被聯結鍵轉化為雜湊值的隨機函式載入到雜湊桶中。只要記憶體充足,這個散列表一直儲存在記憶體中,若記憶體不足,則寫到磁碟。

然後就是讀取大結果集並對聯結鍵列應用雜湊函式。

 較小的 rowsource 被用來構建 hash table 與 bitmap ,第 2 個 row source 被用來被 hansed ,並與第一個 row source 生成的 hash table 進行匹配,以便進行進一步的連線。 Bitmap 被用來作為一種比較快的查詢方法,來檢查在 hash table 中是否有匹配的行。特別的,當 hash table 比較大而不能全部容納在記憶體中時,這種查詢方法更為有用。這種連線方法也有 NL連線中所謂的驅動表的概念,被構建為 hash table 與 bitmap 的表為驅動表,當被構建的 hash table 與 bitmap 能被容納在記憶體中時,這種聯結方式的效率極高。

要使雜湊連線有效,需要設定 HASH_JOIN_ENABLED=TRUE ,預設情況下該引數為 TRUE ,另外,不要忘了還要設定 hash_area_size 引數,以使雜湊連線高效執行,因為雜湊連線會在該引數指定大小的記憶體中執行,過小的引數會使雜湊連線的效能比其他連線方式還 要低。

   注意:決定哪個表是最小的不僅取決於資料行數,還取決於這些行的大小,因為整個行都會存放在散列表中。

最後,總結一下,在哪種情況下用哪種連線方法比較好:

  排序 合併聯結( SortMerge Join , SMJ ):

   a ) 對於非等值連線,這種連線方式的效率是比較高的。

   b ) 如果在關聯的列上都有索引,效果更好。

   c ) 對於將 2 個較大的 rowsource 做連線,該連線方法比 NL 連線要好一些。

   d ) 但是如果 sortmerge 返回的 row source 過大,則又會導致使用過多的 rowid 在表中查詢資料時,資料庫效能下降,因為過多的 I/O.

  巢狀迴圈( NestedLoops , NL ):

   a ) 如果 drivingrow source (外部表)比較小,並且在 inner row source (內部表)上有唯一索引,或有高選擇性非唯一索引時,使用這種方法可以得到較好的效率。

   b ) NESTEDLOOPS 有其它連線方法沒有的的一個優點是:可以先返回已經連線的行,而不必等待所有的連線操作處理完才返回資料,這可以實現快速的響應時間。

  雜湊聯結( HashJoin , HJ ):

   a ) 這種方法是在 oracle7 後來引入的,使用了比較先進的連線理論,一般來說,其效率應該好於其它 2 種連線,但是這種連線只能用在 CBO 優化器中,而且需要設定合適的 hash_area_size 引數,才能取得較好的效能。

   b ) 在 2 個較大的 rowsource 之間連線時會取得相對較好的效率,在一個 row source 較小時則能取得更好的效率。

   c ) 只能用於等值連線中

     d )對索引不要求(有索引也可能走索引,它不會限制sql是訪問方式)

相關推薦

oracle 聯結方法

一般來說,聯結方法分為:巢狀迴圈聯結(Nested Loops),雜湊聯結(Hash-Join),排序合併聯結(Sort Merge Join)以及笛卡爾聯結(Merge Join Cartesian). 1、巢狀迴圈聯結(Nested Loops) 巢狀迴圈有外部表(dr

robotframework遠端連線oracle配置方法

robotframework中需要連線到oracle進行資料庫操作,配置方式: 1、RF伺服器上安裝oracle客戶端Instant ClientNote:此處的安裝和navicat的安裝不同在於軟體版本,navicat與oracle: https://blog.csdn.net/C

本機不裝Oracle,使用plsql連線遠端Oracle方法

由於Oracle的龐大,有時候我們需要在只安裝Oracle客戶端如plsql、toad等的情況下去連線遠端資料庫,可是沒有安裝Oracle就沒有一切的配置檔案去支援。 最後終於發現一個很有效的方法,Oracle的Instant client工具包可以很好地解決這

關於plsql遠端連線oracle,以及連線64位oracle處理方法

1、安裝好plsql及oracle遠端連線的客戶端32位的(instantclient),因為plsql只能通過32位客戶端跟64位oracle連線 2、在instantclient客戶端目錄下,建立

MySql、Oracle(通用方法)遞迴查詢生成檔案目錄樹(JAVA實現 遞迴過程中不訪問資料庫,遞迴之前只訪問兩次 進行遞迴前資料準備)

查詢檔案樹 實體類 public class TradeInfoFile { ​ // 檔案編碼(子) private String fileCode; // 所屬檔案編碼(父) private String belongFileCode; // 交易

Linux下關閉和啟動Oracle方法

1關閉oracle的流程   連線Oracle許可權的使用者   1)sqlplus/ as sysdba   3)Shutdownimmediate 啟動需要兩步 1         sqlplus 下面 sqlplus / as sysdba startup 2  

刪除大量Oracle資料方法總結

Oracle中刪除超過50w條記錄的資料,如果直接使用delete,效率就嚴重受到了影響。那麼首先我們需要了解對於這個表的資料,我們到底是全部刪除,還是部分刪除。這裡有三個關鍵字我們需要注意:truncate,delete,drop,他們之間的異同點可以參考這篇文章——

解決PLSQL Developer無法連線64位ORACLE方法(PLSQL 讀不到ORACLE 的資料庫)

安裝了64位的ORACLE 11g,使用PLSQL Developer配置好之後 ,讀不到oracle的資料庫。 現象如下圖: 結合自己的分析和其它資料,總結了解決方法。 1 因為PLSQL D

unix下查殺ORACLE程序方法

select spid from v$process where addr=(select paddr from v$session where sid=999999); kill -9 spid 非常TMD實用..

oracle 保險方法

upd rowid 進行 update 比較 com alt 技術分享 方法 oracle 中修改比較安全的方法;(pl/sql) 第一種方法: select * from temp where id=9 for update; 第二種方法: select t

oracle spatial操作geometry方法

str pat 交點 volume 拓撲 mbr distance max 內部 兩個對象之間關系: RELATE SDO_GEOM.RELATE --確定兩個對象的交互方式 WITHIN_DISTANCE 驗證: VALIDATE_GEOMETRY_WIT

oracle 11g expdp impdp詳細使用方法

無法登錄 目錄 expdp like tempfile spa ase 平臺 ads 11G中有個新特性,當表無數據時,不分配segment,以節省空間 解決方法如下圖: 二、oracle10g以後提供了expdp/impdp工具,同樣可以解決此問題 1、導出expdp工

oracle 用戶被鎖定解鎖方法

logic 連續 param body ora min 密碼 integer 動態 修改了用戶密碼,第二天過來發現用戶被鎖定,晚上走的時候還好好的 。 alter profile DEFAULT limit FAILED_LOGIN_ATTEMPTS UNLIMITED

Oracle查詢被鎖的表及解鎖方法

v$lock req 查找 rom 方法 session lock acl oracle 1.用下列sql語句查詢操作不當引起鎖表的進程的SESSION_ID及USERNAME SELECT S.SID SESSION_ID, S.USERNAME, DECODE(LMOD

Oracle 閃回區滿解決的方法

recycle arch rec tar cross value ring lec get 閃回區滿: OS: rm -rf [archivelog autobackup backupset controlfile flashback onlinelog] e

Oracle用戶被鎖定解決方法

get fault strong ogr oracle nec failed port clas 1、用dba角色的用戶登陸,進行解鎖,先設置具體時間格式,以便查看具體時間 SQL> alter session set nls_date_format=‘yyyy-

Oracle GoldenGate從oracle db 到非oracle db的初始化數據同步的方法

class article content info 靜態 oracl etl 進程 rep 非oracle db以 sqlserver為樣例說明: 我的思路 A :oracle db 生產 B: oracle db 中間機 C: sqlserver db 目的端

Oracle數據庫中scott用戶不存在的解決方法

復制 product 模式 bsp 目錄 一個 步驟 win 通過 SCOTT用戶是我們學習Oracle過程中一個非常重要的實驗對象,在我們建立數據庫的時候,如果是選擇定制模式的話,SCOTT用戶是不會默認出現的,不過我們可以通過使用幾個簡單命令來使這個用戶出現。以下是解決

Oracle中查看表是否被鎖和如何解鎖的處理方法

objects dba where type 語句 ner term and schema --1、以下幾個為相關表SELECT * FROM v$lock;SELECT * FROM v$sqlarea;SELECT * FROM v$session;SELECT * F

oracle 表空間擴容方法

oracle 表空間擴容方法測試環境OS:RedHat 6.7Oracle:11.2.0.4[[email protected]/* */ ~]# su - oracle[[email protected]/* */ ~]$ sqlplus / as sysdbaSQL*Plus: R