Sql 在同一个表上左连接-花费的时间太长

Sql 在同一个表上左连接-花费的时间太长,sql,sql-server,Sql,Sql Server,此查询需要6-7小时,是否有任何方法可以提高性能 SELECT SUM(INV1.cur_book_bal), SUM(inv2.cur_book_bal), SUM(INV3.CUR_BOOK_BAL), SUM(INV4.CUR_BOOK_BAL) FROM table1 inv1 LEFT JOIN table1 inv2 ON inv1.CIF_KEY = inv2.CIF_KEY LEFT JOIN table1 inv

此查询需要6-7小时,是否有任何方法可以提高性能

SELECT  
    SUM(INV1.cur_book_bal),
    SUM(inv2.cur_book_bal),
    SUM(INV3.CUR_BOOK_BAL),
    SUM(INV4.CUR_BOOK_BAL)  
FROM
    table1 inv1 
LEFT JOIN
    table1 inv2 ON inv1.CIF_KEY = inv2.CIF_KEY
LEFT JOIN
    table1 inv3 ON inv1.CIF_KEY = inv3.CIF_KEY
LEFT JOIN
    table1 inv4 ON inv1.CIF_KEY = inv4.cif_key
                AND inv1.date = '30-JUN-2014' 
                AND inv2.date = '30-juN-2015' 
                AND INV3.dATE = '30-JUNE-2016' 
                AND INV4.DATE = '30-JUNE-17'

在加入之前,请尝试筛选数据,如下所示:

with TABLE_DATA as    
(    
select  CIF_KEY ,date, sum(cur_book_bal)cur_book_bal from table1  where Date in ('30-JUN-2014','30-juN-2015','30-JUNE-2016','30-JUNE-17')    
group by CIF_KEY,date    
)    
SELECT  INV1.cur_book_bal ,inv2.cur_book_bal,INV3.CUR_BOOK_BAL,INV4.CUR_BOOK_BAL      
from TABLE_DATA inv1     
left  join TABLE_DATA inv2    
on inv1.CIF_KEY= inv2.CIF_KEY    
left join TABLE_DATA inv3    
on inv1.CIF_KEY= inv3.CIF_KEY    
left  join TABLE_DATA inv4    
on inv1.CIF_KEY= inv4.cif_key    

where inv1.date = '30-JUN-2014' and inv2.date = '30-juN-2015' AND INV3.dATE = '30-JUNE-2016' AND INV4.DATE = '30-JUNE-17'

编写此查询的最佳方法是使用条件聚合。我很确定这会得到你想要的结果:

SELECT SUM(CASE WHEN date = '2014-06-30' THEN curr_book_bal else 0 end),
       SUM(CASE WHEN date = '2015-06-30' THEN curr_book_bal else 0 end),
       SUM(CASE WHEN date = '2016-06-30' THEN curr_book_bal else 0 end),
       SUM(CASE WHEN date = '2017-06-30' THEN curr_book_bal else 0 end),
FROM table1 inv1 
WHERE date in ('2014-06-30', '2015-06-30', '2016-06-30', '2017-06-30');
表1(日期、当前图书余额)
上有一个索引,这应该是非常快速和准确的


注意使用标准日期格式。强烈建议在查询中写入日期常量。

您使用的是mysql还是sql server?表的结构是什么?索引在哪里?我们讨论的数据量是多少?表中可能有200-300万行。。索引是最新的在oracle数据库上使用sql我们在这里了解完整情况了吗?你是按CIF_键加入表格的,但你的总数就是一切。我们应该去看一组人,在哪里或有?另一方面,根据我的经验,使用特定WHERE子句进行四次单独的求和要比尝试将所有求和合并为一次快得多。不确定这是否有效,因为样本数据必须是2014年,即开始样本。很抱歉,本应提供此信息。。i、 ie示例2014,然后左连接到所有其他日期。我不需要任何连接,然后用于cif_密钥?我发现上面建议的查询中的连接给了我太多的容量。。i、 e基准量应该是2014年的日期,当我加入时,它给了我太多volume@bbb . . . 您的评论似乎表明join版本产生了不正确的结果。你是说这不能产生正确的价值观吗?