[英]optimize the following query time in sql
select *
from ((select 'Temp', r.*
from tab1 r
where (r.fa, r.date, r.status) not in (select r1.fa, r1.date, r1.status from tab2 r1)
) union all
(select 'report', r.*
from tab2 r
where (r.fa, r.date, r.status) not in (select r1.fa, r1.date, r1.status from tab1 r1)
)
) temp
order by fa;
随着数据的增加,查询时间也在增加。 即使数据持续增加,也请提供解决方案以优化时间
因此,您需要数据A + B-(与B相交)。 为此,您使用1联合和2 not in子句。 我试图消除以下查询中的那些:
SELECT *
FROM(
SELECT X.*, COUNT(DISTINCT CN) OVER(PARTITION BY r.fa,r.date,r.status) CNT
FROM (
SELECT 'Temp' CN,r.*
FROM tab1 r
UNION ALL
SELECT 'report' CN,r.*
FROM tab2 r
)X)Y
WHERE Y.CNT=1
基本上,首先应该使用UNION ALL而不是UNION选择所有记录。 之后,筛选出出现在两个表(tab1,tab2)中的那些记录,以便您可以使用分析功能。
对于查询,您应该从索引开始:
tab1(r.fa, r.date, r.status)
tab2(r.fa, r.date, r.status)
这样可以加快查询中的“ not in
部分。 没有办法解决order by
。
通常,不必要使用子查询会带来额外的费用。 但是,由于您正在使用order by
,因此子查询可能不会对性能产生任何影响。
WHERE (a,b) ...
在MySQL中从未进行过优化。 避免构造。
IN ( SELECT ... )
直到最近才得到改进,但是仍然不如EXISTS( SELECT * ...)
或LEFT JOIN .. ON ..
。 重新制定。
NOT IN
,加上以上两项都可以重新格式化为LEFT JOIN ... ON ... WHERE ... IS NULL
您不需要外部的SELECT
,因此可以对UNION
进行排序:
( SELECT ... )
UNION ALL
( SELECT ... )
ORDER BY ... -- applies to UNION
可选地, SELECTs
也可以具有ORDER BY
,但是只有当您具有LIMIT
,它才有用(?)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.