2016-08-05 7 views
1

Betrachten Sie eine Beispieltabelle 'Gehaltsangaben'SQL Abfrage-Optimierung (Zeit)

enter image description here.

Jetzt, nach einigen Vorverarbeitung, habe ich einige IDs in meiner ArrayList ('user_id').

user_id(0): 1 
user_id(1): 3 
user_id(2): 4 
user_id(3): 6 

Was, Ich mag würde Filter tun, ist nur die ids wo Gehalt = 2000

Welcher Ansatz ist besser:

1. 

    for (int i = 0; i < user_id.size(); i++) { 
    SELECT ID FROM salary_details WHERE (part_id = user_id.get(i)) AND (SALARY = 2000) 
    } 

oder

2. 

SELECT ID FROM salary_details 
    WHERE ((part_id = user_id.get(0)) 
    OR (part_id = user_id.get(1)) 
    OR (part_id = user_id.get(2)) 
    OR (part_id = user_id.get(3))) 
    AND (SALARY = 2000) 

Oder Gibt es andere bessere Möglichkeiten?

+1

Es gibt den 'IN'-Operator, der speziell dafür gemacht ist. –

+0

Ja, das ist auch eine Option. Was ich mich wunderte ist: Übergibt Parameter innerhalb der Schleife eine bessere Option oder nicht. Was, wenn ich nach der Vorverarbeitung mehr IDs in meiner Arraylist habe. – Betafish

+0

Was zum Teufel ist diese Syntax: 'user_id.get (2)'? –

Antwort

2

Verwenden Sie die IN Klausel:

SELECT ID FROM salary_details WHERE SALARY = 2000 and part_id (in user_ids) 

Die genaue Syntax auf Ihrem Fahrer/Sprache abhängt (nur eines: eine vorbereitete Anweisung verwenden, verketten nicht SQL und Werte Ihre Abfrage erstellen).

nun die effizienteste Abfrage

  • muss durch Messung
  • ist sehr abhängig von Ihren Daten und Indizes (verwenden explain)
+0

Syntax: 'part_id IN (1,2,3)'. Optimaler Index: 'INDEX (Gehalt, Teil_ID, ID)'. –

2

Keines dieser Abfragen finden läuft in seinem aktuelle Form!

Als Faustregel gilt, dass man die Datenbank nicht mit einer unnötig großen Anzahl von Abfragen trifft. Auf der Grundlage dieser Kriterien Looping und von jeder ID einem nach dem anderen ist ein großer no-no

Die zweite Abfrage ist viel besser, aber immer noch wird es eine große Aufgabe, es aufzubauen sein abfragt, wenn Sie eine große Anzahl von haben Elemente in Ihrem Array.

Der beste Ansatz ist die Verwendung der Klausel IN. Dies ist eine einfache Abfrage, die sehr einfach zu erstellen und für den Abfrageplaner einfach zu parsen ist und die Datenbank nur einmal trifft.

Nachdem gesagt, dass im Zweifelsfall Benchmark!