查询:
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;计划:
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分组依据太慢...它是如何加速的?
发布于 2012-03-02 03:01:50
如果b中的任何行在所有合并的列中都有null值,并且在b.sect和b.m_code中为not null,则将匹配a中的任何行,即执行笛卡尔连接。
我的猜测是,这是导致问题的原因。即使b中实际上没有这样的行,优化器也可能采用笛卡尔连接。
您可以通过添加
and (b.part is not null or b.nums is not null or b.intersec is not null or etc... )此外,让您的统计数据保持最新始终是一个好主意(尽管我不是一个足够了解如何做到这一点的Oracle专家)。
编辑:这在功能上是相同的,并且可能工作得更好:
and (b.part = a.part or b.nums = a.nums or b.intersec = a.intersec or etc... )这将确保至少有一个值匹配。
发布于 2012-03-02 02:39:04
无论何时您有一个CARTESIAN JOIN,它都可能表明您在编写查询时错过了一个联接条件。请检查您的连接,看看您是否遗漏了一个。
发布于 2012-03-02 01:49:25
鉴于WHERE子句中存在这些COALESCE调用,老实说,我不知道这是否可以加速。然而,希望是永恒的。尝试添加以下索引,看看会发生什么:
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分享和享受。
https://stackoverflow.com/questions/9520566
复制相似问题