代码之家  ›  专栏  ›  技术社区  ›  Mark Sherretta

为什么这个查询会导致Oracle中的MERGE-JOIN-CARTESIAN?

  •  6
  • Mark Sherretta  · 技术社区  · 15 年前

    我的问题是:

    select count(*)
    from email_prod_junc j
    inner join trckd_prod t5 on j.trckd_prod_sk = t5.trckd_prod_sk
    inner join prod_brnd b on t5.prod_brnd_sk = b.prod_brnd_sk
    inner join email e on j.email_sk = e.email_sk
    inner join dm_geography_sales_pos_uniq u on (u.emp_sk = e.emp_sk and u.prod_brnd_sk = b.prod_brnd_sk)
    

    我不明白为什么,因为每个表都有一个连接条件。

    3 回复  |  直到 15 年前
        1
  •  4
  •   Mark Sherretta    15 年前

    select /*+ ordered */
    

    我是从 here

        2
  •  2
  •   Allan    15 年前

    如果不知道你的索引和完整的计划,很难说为什么会发生这种情况。我最好的猜测是EMAIL\u PROD\u JUNC和DM\u GEOGRAPHY\u SALES\u POS\u UNIQ相对较小,而且TRCKD\u PROD有一个索引(TRCKD\u PROD\u sk,PROD\u brnd\u sk)。如果是这样的话,那么优化器可能已经决定两个较小表上的笛卡尔函数比过滤TRCKD\u PROD两次要便宜。

        3
  •  0
  •   RMorrisey    15 年前

    我推测这是因为最后一个内部连接的on(x和y)条件。Oracle可能不知道如何优化multi-statement条件,因此它会执行一个完全联接,然后在事后按条件过滤结果。我对甲骨文的解释计划不太熟悉,所以我不能权威地这么说

    如果要验证此假设,可以尝试将查询更改为:

    inner join dm_geography_sales_pos_uniq u on u.emp_sk = e.emp_sk 
    where u.prod_brnd_sk = b.prod_brnd_sk
    

    看看这是否会消除计划中的完全连接