簡體   English   中英

在SQL中優化以下查詢時間

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM