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與Java串連方法
1.資料來源串連,要建立資料來源TestDataBase
package com.shenjun;
import java.sql.*;
public class conn {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
try{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection ct = DriverManager.getConnection("jdbc:odbc:TestDataBase","scott","tiger");
Statement sm = ct.createStatement();
ResultSet rs = sm.executeQuery("select * from student");
while(rs.next()){
System.out.println("使用者名稱:"+rs.getString(2));
}
}catch(Exception e){
e.printStackTrace();
}
}
}
2.jdbc串連,引jar包
package com.shenjun;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class conn2 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
try{
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection ct = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:ORCL","scott","tiger");
Statement sm = ct.createStatement();
ResultSet rs = sm.executeQuery("select * from student");
while(rs.next()){
System.out.println("使用者名稱:"+rs.getString(2));
}
}catch(Exception e){
e.printStackTrace();
}
}
}...餘下全文>>
怎建立oracle串連其他資料庫的方法?
目前oracle提供一種叫做 透明網關 的類似於外掛程式的東西,安裝這個之後,oracle資料庫就可以和其他資料庫環境通過dblink串連了
但這個安裝比較費勁
容易的辦法是,用java應用直接從兩個資料庫中讀寫。
如果都是oracle資料庫的話,只用dblink就行
create database link XXX connect to USER identified by PASSWORD using 'DBNAME'