在From子句中更改表并更改过滤器会影响SQL性能吗?

时间:2014-06-05 08:36:14

标签: sql left-join sybase

我最近在这里问了一个关于SO的问题:

SQL Joins Taking forever on table with 60 matches

我通过更改FROM子句和一些过滤器,将查询的性能从无穷大降低到大约8分钟。

sql改为:

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

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_1.curr_me_date THEN cal_1.date END) as Reporting_Cycle_This,
(CASE WHEN tb.pl_date = cal_2.prev_me_date THEN cal_2.date END) as Reporting_Cycle_Last,
(CASE WHEN tb.pl_date = cal_2.prev_me_date THEN cal_2.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 Partition p  
LEFT OUTER JOIN TrialBal tb 
    ON tb.pl_date = '2014-04-30'
    AND tb.entity = 'My_entity'
    AND 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_1 on tb.pl_date = cal_1.curr_me_date 
    AND tb.entity = cal_1.entity
LEFT OUTER JOIN CalendarEngine cal_2 on tb.pl_date = cal_2.curr_me_date 
    AND tb.entity = cal_2.entity
GROUP BY ad.acct_lv2, ad.acct_lv3, ad.acct_lv4, ad.acct_lv6, cal_1.date, cal_2.date

这是DBA推荐的变化,但为什么会有显着改善? TrialBal有800万+行,如何将这个表移动到OUTER JOIN并远离FROM子句会产生这样的差异? Sybase优化器不会分析最有效的执行路径吗?并且在构建查询时让FROM子句引用最小的表是一个很好的规则吗?

0 个答案:

没有答案