代码之家  ›  专栏  ›  技术社区  ›  thecoop

Oracle是否为同一表列上的每个联接重新散列驱动表?

  •  1
  • thecoop  · 技术社区  · 16 年前

    假设您对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没有正确的外部哈希连接,它需要为两个连接哈希表1。它重新散列了吗 table1 t2 t3 (即使它使用相同的联接列),还是为两个联接保留相同的哈希信息?

    2 回复  |  直到 16 年前
        1
  •  2
  •   Gary Myers    16 年前

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

    将表1连接到表2可以得到500行。然后它将结果集连接到表3,得到(也许)700行。

    它不会将表1连接到表2,然后将表1连接到表3,然后将这两个中间结果连接起来。

        2
  •  1
  •   Jeffrey Kemp    16 年前

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

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

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

    这个示例计划涉及到对表1的扫描,对其内容进行散列;扫描表2,散列 结果 最后扫描表3。

    它还有其他的计划可以选择。