表連線的方式及其使用場合:
nested loop
對於被連線的資料子集較小的情況,nested loop連線是個較好的選擇。nested loop就是掃瞄乙個表,每讀到一條記錄,就根據索引去另乙個表裡面查詢,沒有索引一般就不會是 nested loops。
一般在nested loop中, 驅動表滿足條件結果集不大,被驅動表的連線欄位要有索引,這樣就走nested loop。如果驅動表返回記錄太多,就不適合nested loops了。如果連線字段沒有索引,則適合走hash join,因為不需要索引。
可用ordered提示來改變cbo預設的驅動表,可用use_nl(table_name1 table_name2)提示來強制使用nested loop。
hash join
hash join是cbo 做大資料集連線時的常用方式。優化器掃瞄小表(或資料來源),利用連線鍵(也就是根據連線字段計算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提示來改變cbo預設的驅動表,可用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 資料庫中的表
oracle 資料庫中的表 使用者定義的表 使用者自己建立並維護的一組表 包含了使用者所需的資訊 資料字典 由oracle server自動建立的一組表 包含資料庫資訊 select table name from user tables select distinct object type fr...
Oracle資料庫連線報12505解決方法
oracle資料庫連線時,報錯,如下 解決方法 1.windows系統 管理工具 服務,開啟服務,雙擊oracleservice 為你的資料庫 sid 看檢視oracle安裝路徑 2.開啟資料庫例項的目錄,例如 d product 11.2.0 dbhome 1 network admin 找到li...
plsql 連線oracle資料庫的2種方式
該檔案在instantclient資料夾中,我直接將instantclient拷貝到了plsql的根目錄下 路徑 修改 該檔案用於配置資料庫連線位址,配置好後,訪問該資料庫不再需要通過ip port instance,可以直接通過別名來訪問該資料庫 資料庫訪問位址別名 隨便起 database te...