[英]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.