首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在计划中使用'merge join cartesian‘优化oracle查询?

如何在计划中使用'merge join cartesian‘优化oracle查询?
EN

Stack Overflow用户
提问于 2012-03-02 00:59:34
回答 3查看 7.2K关注 0票数 3

查询:

代码语言:javascript
复制
select max(b.counter) as counter,
       b.m_group,
       b.m_code,
       a.s_id,
       s.id_sk
  from tbl_various a, tbl_map b, tbl_sheet s
 where coalesce(b.part, a.part) = a.part
   and coalesce(b.nums, to_number(a.nums)) = a.nums
   and coalesce(b.interc, a.interc) = a.interc
   and coalesce(b.segment, a.segment) = a.segment
   and coalesce(b.acountry, a.acountry) = a.acountry_midas
   and coalesce(b.orig_name, a.orig_name) = a.orig_name
   and coalesce(b.fact, a.fact) = a.fact
   and b.sect is not null
   and s.m_code = b.m_code
 group by b.m_group, b.m_code, a.s_id, s.id_sk;

计划:

代码语言:javascript
复制
SELECT STATEMENT, GOAL = ALL_ROWS       86763   1           169
 HASH GROUP BY                          86763   1           169
  HASH JOIN                             86762   1           169
   TABLE ACCESS FULL    TBL_MAP         2       1717        92718
   MERGE JOIN CARTESIAN                 79688   300133251   34515323865
    TABLE ACCESS FULL   TBL_SHEET       5       912         18240
    BUFFER SORT                         79682   329274      31281030
     TABLE ACCESS FULL  TBL_VARIOUS     87      329274      31281030

分组依据太慢...它是如何加速的?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-03-02 03:01:50

如果b中的任何行在所有合并的列中都有null值,并且在b.sectb.m_code中为not null,则将匹配a中的任何行,即执行笛卡尔连接。

我的猜测是,这是导致问题的原因。即使b中实际上没有这样的行,优化器也可能采用笛卡尔连接。

您可以通过添加

代码语言:javascript
复制
and (b.part is not null or b.nums is not null or b.intersec is not null or etc... )

此外,让您的统计数据保持最新始终是一个好主意(尽管我不是一个足够了解如何做到这一点的Oracle专家)。

编辑:这在功能上是相同的,并且可能工作得更好:

代码语言:javascript
复制
and (b.part = a.part or b.nums = a.nums or b.intersec = a.intersec or etc... )

这将确保至少有一个值匹配。

票数 1
EN

Stack Overflow用户

发布于 2012-03-02 02:39:04

无论何时您有一个CARTESIAN JOIN,它都可能表明您在编写查询时错过了一个联接条件。请检查您的连接,看看您是否遗漏了一个。

票数 1
EN

Stack Overflow用户

发布于 2012-03-02 01:49:25

鉴于WHERE子句中存在这些COALESCE调用,老实说,我不知道这是否可以加速。然而,希望是永恒的。尝试添加以下索引,看看会发生什么:

代码语言:javascript
复制
TBL_VARIOUS
  PART
  NUMS
  INTERC
  SEGMENT
  ACOUNTRY_MIDAS
  ORIG_NAME
  FACT
  S_ID

TBL_MAP
  PART
  NUMS
  INTERC
  SEGMENT
  ACOUNTRY
  ORIG_NAME
  FACT
  SECT
  M_CODE
  (M_GROUP, M_CODE)

TBL_SHEET
  M_CODE
  ID_SK

分享和享受。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9520566

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档