2016-12-01 3 views
0
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; 

Da die Daten steigen, steigt die Abfragezeit. Bitte stellen Sie eine Lösung zur Verfügung, um die Zeit zu optimieren, selbst wenn die Daten weiter ansteigenOptimieren Sie die folgende Abfragezeit in sql

+1

In welchem ​​Datenbanksystem befinden Sie sich? SQL Server, Oracle, MySQL usw. –

+0

Meine SQL-Arbeitsbank –

+1

Relevante Informationen für Fragen zur Abfrageoptimierung enthalten den aktuellen Abfrage-/Optimierungsplan, vorhandene Indizes und ungefähre Tabellengrößen. –

Antwort

0

so wollen Sie Daten A + B - (ein Schnittpunkt B). Dafür verwenden Sie 1 Union und 2 nicht in Klausel. Ich habe versucht, diese in der folgenden Abfrage zu beseitigen:

Grundsätzlich zuerst sollten Sie alle Datensätze mit UNION ALL statt UNION auswählen. Danach filtern Sie die Datensätze aus, die in beiden Tabellen (tab1, tab2) erschienen sind, für die Sie die analytische Funktion verwenden können.

+0

Einschränkung: 'OVER (PARTITION BY ...)' ist nur in MariaDB 10.2 verfügbar. –

0

Für Ihre Abfrage, sollten Sie mit Indizes starten:

  • tab1(r.fa, r.date, r.status)
  • tab2(r.fa, r.date, r.status)

Dies sollte den not in Teil der Abfragen beschleunigen. Es gibt keinen Weg um die order by.

Im Allgemeinen verursacht die Verwendung einer Unterabfrage zusätzliche Kosten. Da Sie jedoch order by verwenden, macht die Unterabfrage wahrscheinlich keinen Unterschied in Bezug auf die Leistung.

+0

cn u plz schreibe die genaue Abfrage –

0

WHERE (a,b) ... wurde in MySQL nie gut optimiert. Vermeide das Konstrukt.

IN (SELECT ...) wurde erst kürzlich verbessert, ist aber immer noch nicht so gut wie EXISTS(SELECT * ...) oder LEFT JOIN .. ON ... Neuformulieren.

(SELECT ...) 
UNION ALL 
(SELECT ...) 
ORDER BY ... -- applies to UNION 

Optional kann das SELECTs auch ORDER BY haben könnte:

NOT IN plus beiden oben kann

Sie brauchen nicht die äußere SELECT in LEFT JOIN ... ON ... WHERE ... IS NULL neu formuliert werden, können Sie eine UNION so sortieren , aber es ist nur nützlich (?), wenn Sie eine LIMIT haben.