Nicht vorhanden vs Nicht In: Effizienz

8

Ich war immer davon ausgegangen, dass es nicht den Weg gibt, den man gehen muss, anstatt einen nicht-in-Zustand zu benutzen. Bei einem Vergleich mit einer Abfrage, die ich verwendet habe, habe ich jedoch festgestellt, dass die Ausführung für den Not-in-Zustand tatsächlich schneller zu sein scheint. Jeder Einblick, warum dies der Fall sein könnte, oder ob ich bis jetzt eine schreckliche Annahme gemacht habe, wäre sehr zu begrüßen!

ABFRAGE 1:

%Vor%

ABFRAGE 2:

%Vor%

Aktueller Ausführungsplan für Abfrage 1:

Aktueller Ausführungsplan für Abfrage 2:

ZEIT / IO-STATISTIK:

Abfrage # 1 (Verwendung nicht vorhanden):

%Vor%

Abfrage # 2 (mit Nicht in):

%Vor%     
tchock 09.07.2015, 23:01
quelle

6 Antworten

1

probiere

aus %Vor%     
paparazzo 09.07.2015, 23:18
quelle
1

soweit ich es verstehe, ein nicht in der gleichen Weise wie zwei verschachtelte Anweisungen würde.

Also, wenn Sie zwei Tabellen haben: Tabelle (1000 Datensätze) und Tabla (2000 Datensätze),

%Vor%

ist wie

%Vor%

das ist 1000 * 2000 = 2 Millionen Operationen.

der linke Join mit Tabla.field ist Null-Trick, wieder, soweit ich es verstehe, macht nur 2000 Operationen

Verwenden Sie den linken Join.

    
Prefijo Sustantivo 09.07.2015 23:33
quelle
1

Die Frage war: "warum NOT IN scheint schneller zu sein als NOT EXISTS ".

Meine Antwort ist: es scheint nur schneller zu sein, aber es ist dasselbe. (in diesem Fall)

Haben Sie tatsächlich die Zeit für beide Abfragen gemessen und bestätigt, dass ein Unterschied besteht?

ODER Sie haben sich nur die Ausführungspläne angesehen?

Soweit ich weiß, sind die Abfragekosten, die Sie auf den Screenshots sehen (53% gegenüber 47%):

  • geschätzte Abfragekosten, obwohl die Pläne tatsächlich sind;
  • es ist die Abfrage kosten , nicht die Zeit, die aus CPU und IO "Kosten" kombiniert wird.

Es scheint, dass in diesem speziellen Fall der Abfrageoptimierer fast identische Pläne für beide Abfragen erzeugt hat. Es ist sehr wahrscheinlich, dass sich die Pläne in der geschätzten Anzahl von Reihen für einige Bediener in den Plänen (geringfügig) unterscheiden, aber die tatsächliche Leistung ist die gleiche, da die Grundrissform die gleiche ist. Wenn sich die geschätzte Anzahl der Zeilen unterscheidet, würde dies zu anderen geschätzten Abfragekosten führen, die Sie sehen.

Um den Unterschied in den Plänen (falls vorhanden) zu sehen, würde ich ein Tool wie verwenden SQL-Sentry-Plan-Explorer Es zeigt mehr Details und Sie können alle Aspekte der Abfragen einfacher vergleichen.

Das Umschreiben der Abfrage, um schneller zu sein, ist eine andere Frage und ich versuche nicht, sie hier zu beantworten.

    
Vladimir Baranov 10.07.2015 02:54
quelle
1

Ich denke, der fehlende Index verursacht den Unterschied für die Operationen EXISTS() und IN .

Obwohl die Frage nicht nach einer besseren Abfrage fragt, aber ich werde versuchen, das Distinct so zu vermeiden

%Vor%     
Eric 10.07.2015 02:04
quelle
0

Dies setzt voraus, dass Sie versuchen, Accounts zu finden, die keinen primären Kontakt haben und es nur einen primären Kontakt geben kann

%Vor%

Wenn Sie Accounts mit Kontakten haben wollen, die keinen primären Kontakt haben, können Sie

verwenden %Vor%     
JamieD77 10.07.2015 00:15
quelle
0

Sie können darauf verzichten, Salesforce_Contacts mehr als einmal zu treffen. Dies ist kompakter und schneller:

%Vor%

Der Unterschied zwischen IN und EXISTS ist vernachlässigbar.

    
Diego 10.07.2015 02:55
quelle