您好:
我在網路上 看到HASH JOIN 的解釋
說明(1):
步骤:将两个表中较小的一个在内存中构造一个HASH表(对JOIN KEY),扫描另一个表,
同样对JOIN KEY进行HASH后探测是否可以JOIN。适用于记录集比较大的情况。
需要注意的是:如果HASH表太大,无法一次构造在内存中,则分成若干个partition,写入磁盘的temporary segment,
则会多一个写的代价,会降低效率。
但另外一個說明(2):
假如有A、B兩張表進行哈希連接,那麼ORACLE會首先將B表在內存中建立一棵以散列表形式存在的查詢二叉樹C
,然後開始讀取A表的第一條記錄,從C中去找匹配的記錄,如果有,則推到結果集中。再提取A中的第二條記錄,
如果有,則推到結果集中,以此類推,直到A中沒有記錄,返回結果集。
請問這是否有矛盾之處?
說明(2)中,B表是否為較小的TABLE-->產生C 表,那A表是BIG TABLE? 所以是 (A)Big Table 去找 C(hash table),再傳回 嗎?
謝謝!
------解决思路----------------------
hash join:
A join in which the database uses the smaller of two tables or data sources to build a hash table in memory. The database scans the larger table, probing the hash table for the addresses of the matching rows in the smaller table.
这是官方的注解。
没有矛盾,第二段说明是对第一段的补充。除了A, B两表说得不够明确,哈希连接采用较小的那张来建立哈希表,即第二段说明中的B表
然后扫描A表,探测哈希表C中是否存在对应的记录。如果存在,推到结果集中,不存在,则抛掉