Sql 在同一个表上左连接-花费的时间太长
此查询需要6-7小时,是否有任何方法可以提高性能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
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版本产生了不正确的结果。你是说这不能产生正确的价值观吗?