通常情況下hash join的效果都比Sort merge join要好,然而如果行源已經被排過序,在執行排序合并連接時不需要再排序了,這時Sort merge join的性能會優于hash join?梢允褂肬SE_MERGE(table_name1 table_name2)來強制使用Sort merge join。
cost = (outer access cost * # of hash partitions) + inner access cost
Hash join:
適用于兩個表的數據量差別很大。但需要注意的是:如果HASH表太大,無法一次構造在內存中,則分成若干個partition,寫入磁盤的temporary segment,則會多一個I/O的代價,會降低效率,此時需要有較大的temporary segment從而盡量提高I/O的性能。
可以用USE_HASH(table_name1 table_name2)提示來強制使用散列連接。如果使用散列連HASH_AREA_SIZE 初始化參數必須足夠的大,如果是9i,Oracle建議使用SQL工作區自動管理,設置WORKAREA_SIZE_POLICY 為AUTO,然后調整PGA_AGGREGATE_TARGET 即可。
也可以使用HASH_JOIN_ENABLED=FALSE(默認為TRUE)強制不使用hash join。
cost = (outer access cost * # of hash partitions) + inner access cost
效率比較
Hash join的主要資源消耗在于CPU(在內存中創建臨時的hash表,并進行hash計算),而merge join的資源消耗主要在于磁盤I/O(掃描表或索引)。在并行系統中,hash join對CPU的消耗更加明顯。所以在CPU緊張時,最好限制使用hash join。
在絕大多數情況下,hash join效率比其他join方式效率更高:
在Sort-Merge Join(SMJ),兩張表的數據都需要先做排序,然后做merge。因此效率相對最差;
Nested-Loop Join(NL)效率比SMJ更高。特別是當驅動表的數據量很大(集的勢高)時。這樣可以并行掃描內表。
Hash join效率最高,因為只要對兩張表掃描一次。
文章來源于領測軟件測試網 http://www.kjueaiud.com/