SQL连接表上永远以有60场比赛(SQL Joins Taking forever on table

2019-10-29 03:55发布

我有一个查询,使4个表之间的联接。

匹配对表的基础表我输入PARAMS yeilds以下

TrialBal - 800万记录匹配的实体和pl_date

加入到ActDetail - 执行约85秒后,行数为8672175(与组,行数为1 ...现在)。 ActDetail将在内部联接返回零行。

加入到CalendarEngine - 只有60个在此表(pl_date和实体)的记录相配套,但是当这种被引入到SQL,查询只运行和运行。 对此有什么特别的原因?

CalendarEngine在我的查询不使用对实体综合指数和另外一个领域,所以我应该还是可以使用它?

为什么会加入之间TrailBal和ActDetail相对较快(大概是OUTER JOIN通过所有800万条记录针对ActDetail 168K的条目数量上运行),但加入了关于60个记录CalendarEngine导致看似无穷无尽的循环。

下面的SQL(我需要在最终的查询的注释字段)。 也试过更换或语句2外部联接

SELECT 
    ad.acct_lv2 AS IFRS_lvl2,
    ad.acct_lv3 AS IFRS_lvl3,
    ad.acct_lv4 AS IFRS_lvl4,
    ad.acct_lv6 AS IFRS_lvl6,
    --(CASE WHEN tb.pl_date = cal.curr_me_date THEN cal.date END) as Reporting_Cycle_This,
    --(CASE WHEN tb.pl_date = cal.prev_me_date THEN cal.date END) as Reporting_Cycle_Last,
    --(CASE WHEN tb.pl_date = cal.prev_me_date THEN cal.date END) as Reporting_Cycle_Previous,
    null as Total,
    null as Balance_default_dim,
    null as Balance_proxy_dim,
    0 as percentage_bal_proxy_applied,
    '1 Table Data' as rowType 
FROM TrialBal tb 
INNER JOIN Partition p ON p.partition_code = tb.partition_code
    AND p.entity = tb.entity
LEFT OUTER JOIN ActDetail ah ON tb.actNum = ad.actNum
    AND tb.cpny = ad.cpny
    AND tb.pl_date = ad.pl_date
    AND ad.source = 'Ground0'
--LEFT OUTER JOIN CalendarEngine cal on tb.pl_date = cal.curr_me_date OR tb.pl_date = cal.prev_me_date
    --AND tb.entity = cal.entity
WHERE tb.pl_date = '2014-04-30'
AND tb.entity = 'My_entity'
GROUP BY ad.acct_lv2, ad.acct_lv3, ad.acct_lv4, ad.acct_lv6, --tb.actNum, tb.cpny, 
    CASE WHEN tb.pl_date = cal.curr_me_date THEN cal.date END,
    CASE WHEN tb.pl_date = cal.prev_me_date THEN cal.date END,
    CASE WHEN tb.pl_date = cal.prev_me_date THEN cal.date END

也试图与2的外部联接更换或声明:

LEFT OUTER JOIN sCalendar cal_cur on tb.pnl_date = cal_cur.curr_me_date
    AND tb.entity_code = cal_cur.entity_code
LEFT OUTER JOIN sCalendar cal_pre on tb.pnl_date = cal_pre.prev_me_date
    AND tb.entity_code = cal_pre.entity_code

Answer 1:

是否有cal.curr_me_date和tb.pl_date的指数? 当我有类似的问题我去寻找索引我加盟领域,那就是修复。



Answer 2:

你为什么这样做加盟

LEFT OUTER JOIN ActDetail ah ON tb.actNum = ad.actNum
AND tb.cpny = ad.cpny
AND tb.pl_date = ad.pl_date
AND ad.source = 'Ground0'

我没有看到任何使用,列,删除unnecesary连接。

如果这部分日期

tb.pl_date = '2014-04-30'

我建议使用

 pl_date >= dateadd(d,0,datediff(d,0,pl_date)) and pl_date < dateadd(d,0,datediff(d,0,pl_date+1))

问候



文章来源: SQL Joins Taking forever on table with 60 matches