1

假设您在 9i 上有以下查询:

SELECT /*+ USE_HASH(t2 t3) */
* FROM
table1 t1    -- this has lots of rows
LEFT JOIN table2 t2 ON t1.col1 = t2.col1
    AND t1.col2 = t2.col2
LEFT JOIN table3 t3 ON t1.col1 = t3.col1
    AND t1.col2 = t3.col2

由于 9i 没有 RIGHT OUTER HASH JOIN,它需要为两个连接对 table1 进行哈希处理。table1它是否在连接t2和之间重新散列t3(即使它使用相同的连接列),或者它是否为两个连接保留相同的散列信息?

4

2 回答 2

2

它需要重新散列,因为第二个散列将是 table3 针对 table1/table2 的连接而不是针对 table1。或相反亦然。

例如,假设 TABLE1 有 100 行,table2 有 50 行,table3 有 10 行。将 table1 连接到 table2 可能会产生 500 行。然后它将该结果集连接到 table3 以提供(可能)700 行。

它不会将 table1 连接到 table2,然后将 table1 连接到 table3,然后连接这两个中间结果。

于 2010-06-02T23:56:27.940 回答
1

看看计划,它会告诉你答案。

一个例子可能是这样的(我刚刚做了这个):

SELECT
  HASH JOIN
    HASH JOIN
      TABLE FULL SCAN table1
      TABLE FULL SCAN table2
  TABLE FULL SCAN table3

此示例计划涉及对 table1 的扫描,并在其内容进行时对其内容进行散列;扫描 table2,将连接的结果散列到第二个散列中,然后最后扫描 table3。

它还有其他计划可供选择。

如果 table1 是最大的表,并且优化器知道这一点(由于统计信息),它可能不会驱动它。

于 2010-06-02T12:04:27.497 回答