Frage zu SQL "WHERE IN (1, 2, 3. , N)"

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hallo,

ich komme leider nicht drumherum, SQL-Abfragen mit einem IN - Statement zu machen, wobei die Anzahl des Arrays für dieses IN-Statement leider sehr hoch ist ( > 1500 ). Jetzt habe ich schon mehrfach nachgelesen, das ein IN-Statement bei Arraygrößen > 100 nicht sehr performant arbeitet.

Meine Frage dazu wäre: Macht es Sinn, die Abfrabe auf mehrere zu verteilen (also immer mit jeweils 100 Datensätzen, die ich in der IN-Klausel prüfe) ? Würden sich hierzu PreparedStatements anbieten, oder hat das hier üerhaupt keinen Effekt? Macht es auch evtl. Sinn das Array zu sortieren, oder ist es für die Ausführungsgeschwindigkeit des SQL völlig egal, in welcher Reihenfolge meine ID´s in das IN-Statement geschoben werden? (Es handelt sich hierbei um Primary Keys aus einer anderen Tabelle).

Vielen Dank im Vorraus!

Gruß
Christian
 

foobar

Top Contributor
Eine In-Klausel mit 1500 Elementen? Das kommt mir spanisch vor.

Kannst du das nicht mit einem Join oder Subselect lösen? Oder vielleicht mit einer temporären Tabelle?
 

Det

Mitglied
Bei manuellen Abfragen habe ich schon festgestellt, dass manche Datenbanken nur eine gewisse Anzahl von Elementen bei IN verarbeiten können. Ich muss dazu sagen, dass ich da zu faul zum Nachdenken war und lieber mit Copy/Paste gearbeitet habe. Denn normalerweise sollte man versuchen, hier ein JOIN (ohne T :cool: ) zu basteln. Ich nehme ja an, dass du die Werte in deinem Array auch per SELECT ermittelt hast. Falls ein direkter JOIN nicht möglich ist, könnte man die Werte vielleicht (in mehrere Schritten, falls nötig) in eine temporäre Tabelle schieben und damit joinen.

Also statt

Code:
SELECT ... FROM tabelle1 WHERE bedingung1
==> liste
SELECT ... FROM tabelle2 WHERE id IN [liste]
irgendwas wie
Code:
SELECT tabelle2... FROM tabelle1, tabelle2 WHERE tabelle1.fk_feld = tabelle2.id AND tabelle1.bedingung1
oder
Code:
SELECT id INTO temp FROM tabelle1 WHERE bedingung1
SELECT id INTO temp FROM tabelle1 WHERE bedingung2
...
SELECT tabelle2... FROM temp, tabelle2 WHERE temp.id = tabelle2.id
 
G

Guest

Gast
Hallo!

Danke für eure schnellen Antworten.

Leider kann ich das so nicht umsetzen, denn das Array für mein IN kommt aus einem JAVA-Array und wird nicht durch eine DB-Query ermittelt. Die ID´s in diesem Array sind Primärschlüssel einer anderen Tabelle.

Oder gibt es da dennoch eine Möglichkeit? Leider fehlt mir das entsprechende Know-How, ich hatte bisher noch nie etwas mit temporären Tabellen zu tun.
 

byte

Top Contributor
Teil das Array doch einfach auf. Also aus einem langsamen Select machst Du viele schnelle.
 
S

SlaterB

Gast
und zurück zur eigentlichen Frage:
das IN dürfte so langsam sein, weil so viele Vergleiche durchzuführen sind,
mehrere kleinere INs in einer Query sind demnach genauso langsam, die Anzahl der Vergleiche bleibt gleicht
 

semi

Top Contributor
SlaterB hat gesagt.:
das IN dürfte so langsam sein, weil so viele Vergleiche durchzuführen sind,
mehrere kleinere INs in einer Query sind demnach genauso langsam, die Anzahl der Vergleiche bleibt gleicht
Ist das eine Feststellung oder eine Frage ohne Fragezeichen? ;) Das ganze geht schnell bei indizierten Feldern.

Nur mal so als Warnung, bei Oracle liegt das Limit bei 1000 Einträgen in der IN-Klausel.
 
S

SlaterB

Gast
eine Vermutung und jede DB wäre schön doof, wenn sie große INs nicht automatisch in mehrere kleine aufspaltet, falls das schneller ginge
 

Det

Mitglied
Anonymous hat gesagt.:
... das Array für mein IN kommt aus einem JAVA-Array und wird nicht durch eine DB-Query ermittelt. Die ID´s in diesem Array sind Primärschlüssel einer anderen Tabelle.

Oder gibt es da dennoch eine Möglichkeit? Leider fehlt mir das entsprechende Know-How, ich hatte bisher noch nie etwas mit temporären Tabellen zu tun.

Statt einer temporären Tabelle kann man dafür sicher auch eine "normale" Tabelle verwenden.

Auf Java-Ebene kann man da übrigens auch eine Menge Zeit vertrödeln, z.B. je nachdem wie man aus dem Array den SQL-String zusammenbaut. Ich würde deshalb zunächst einfach mal direkt mit SQL ausprobieren, was schneller ist:

a) deine bisherige Lösung mit IN
b) Tabelle anlegen, die nur ein Feld für die IDs enthält - IDs einfügen - Abfrage mit JOIN über beide Tabellen ausführen
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Frage zu Bundesliga-DB Datenbankprogrammierung 1
pkm Frage zu Encodingproblem bei einer Datenbankanbindung Datenbankprogrammierung 1
B Frage bei einer SQL Query Datenbankprogrammierung 3
B Frage zu Datenbank Design bei Events (ZenDesk) Datenbankprogrammierung 1
B SQLite Frage zu SQLite Datenbankverbindung Datenbankprogrammierung 7
M Frage zu JSON Datenbankprogrammierung 16
Psypsy Hibernate / JPA OneToOne MappedBy Frage Datenbankprogrammierung 2
P Frage zu Connection.close() Datenbankprogrammierung 4
R MySQL Frage zum Anlegen von Artikeln inkl. Verbindungen Datenbankprogrammierung 0
M Grundlegende Klassen-Design Frage Datenbankprogrammierung 0
P MySQL Frage zur Einbindung in ein Java Projekt Datenbankprogrammierung 2
I Frage zu Datenmodellierung Datenbankprogrammierung 3
J Normalisierung - Allgemeine Frage zur 3. Normalform (Eventuelle Abhängigkeit) Datenbankprogrammierung 4
F Normalisierung Datenbank Frage Datenbankprogrammierung 5
J Frage zu ResultSet Datenbankprogrammierung 3
W Frage zur Datenbankwahl bei Umstieg auf Java Datenbankprogrammierung 7
D Frage zu DISTINCT in SQL Datenbankprogrammierung 5
K Frage zur Datenprotokollierung bei DML Anweisungen Datenbankprogrammierung 3
K Frage zu SQL Datenbankprogrammierung 2
L PostgreSQL Hibernate-Frage Datenbankprogrammierung 2
K Frage zu Datenbankmodellierung Datenbankprogrammierung 15
D Generelle Frage zum Umgang mit Datensätzen Datenbankprogrammierung 5
L Frage zu UpdateQuery Datenbankprogrammierung 12
8 MySQL Kurze Frage zur Sicherheit Datenbankprogrammierung 9
D Frage zu INSERTS über mehrere Datenbanktabellen Datenbankprogrammierung 3
D Frage zu Ausführungsmöglichkeiten von SQL Befehlen Datenbankprogrammierung 13
D Frage zu SQL Syntax Datenbankprogrammierung 17
D Frage zu potenziellen Leerzeichen in einer Datenbank Datenbankprogrammierung 5
X Connection schließen oder speichern? Performance Frage Datenbankprogrammierung 7
J mal wieder eine Frage zu parallelen Transaktionen.. Datenbankprogrammierung 2
V Frage zu Hibernate-Mapping Datenbankprogrammierung 11
N Allg. Frage zur Datenbankverbindung Datenbankprogrammierung 2
E einfache Frage bei DB-Zugriff Datenbankprogrammierung 11
S MySQL Frage zu LeftJoin Abfrage Datenbankprogrammierung 2
O eigentlich simple SQL Frage Datenbankprogrammierung 2
M Frage zu folgender Query in EJB-QL Datenbankprogrammierung 4
H JBoss: Frage zur Datasource in der ...-ds.xml Datenbankprogrammierung 4
F Frage zu Prepared Statement Datenbankprogrammierung 2
R hibernate Frage zu configFile-Pfad und Groß/Kleinschreibung von Postgres-Tabellen Datenbankprogrammierung 8
U Frage zum Erfassen von hinzufügten und entfernten Objekten Datenbankprogrammierung 9
M prinzipielle Frage zu Datenbanken und jars ... Datenbankprogrammierung 2
S Hibernate - spezielle Frage, n zu n Beziehung Datenbankprogrammierung 11
R Frage zu PreparedStatement/ResultSet Datenbankprogrammierung 16
J Frage zu Synchronisation bei parallelem Zugriff, speziell mit JPA Datenbankprogrammierung 2
F EclipseLink persistence.xml Frage Datenbankprogrammierung 11
N Frage zur Sicherheit von Konfigurationsdatei Datenbankprogrammierung 4
H performance frage Datenbankprogrammierung 9
G Frage zum Insert-Statement Datenbankprogrammierung 2
Antoras Design-Frage: Datenzuordnung zu verschiedenen Accounts Datenbankprogrammierung 2
T HSQL: verständnis Frage Datenbankprogrammierung 2
T Java JPA Frage bzgl. DISTINCT Datenbankprogrammierung 2
G Frage zu connection? Datenbankprogrammierung 9
A Frage zu SQL-Abfrage Datenbankprogrammierung 2
G Allgemeine Frage zu Datenbanklimits Datenbankprogrammierung 27
G allgemeine JDBC-Connection Frage Datenbankprogrammierung 2
G Frage zu Hibernate und M:N Beziehung Datenbankprogrammierung 9
K HQL Frage Datenbankprogrammierung 10
D kurze Frage zu einem Query Datenbankprogrammierung 6
B Hibernate mit MySql - Verständniss Frage Datenbankprogrammierung 8
N Kleine Frage zu Connection Pooling mit DataSource Datenbankprogrammierung 2
T Update-Frage Datenbankprogrammierung 11
E SQL-Frage (Löschen aller Datensätze) Datenbankprogrammierung 9
P Frage zu Performancetest einer Datenbank Datenbankprogrammierung 3
W Frage zum Umgang mit DB-Daten Datenbankprogrammierung 2
E Nochmal eine Datenbankabfrage Frage :-o (JOIN oder so) Datenbankprogrammierung 4
P frage zu "" bei INSERT STATEMENTS Datenbankprogrammierung 2
K frage zum ausführen eines INSERT statements Datenbankprogrammierung 16
L frage zu mySQL Datenbankprogrammierung 4
C Mal ne Frage an die Experten Datenbankprogrammierung 4
G Frage zum Datenbankdesign Datenbankprogrammierung 5
J DB Verbindung Design Frage Datenbankprogrammierung 5
M Datenbankanbindung in Java : Newbie-Frage Datenbankprogrammierung 2
U Grundsätzliche Frage Datenbankprogrammierung 4
S Frage zu INSERT Datenbankprogrammierung 2
X Wieder mal ne Frage ... Datenbankprogrammierung 15
Juelin Java und MySQL MariaDB - WHERE-Klausel Datenbankprogrammierung 17
J Mehrere WHERE Werte benutzen Datenbankprogrammierung 2
B JPA -> Dynamische WHERE Clause / SQL Injection möglich? Datenbankprogrammierung 11
J Hibernate One-To-One mit Where Klausel Datenbankprogrammierung 6
D Fälle bei WHERE unterscheiden Datenbankprogrammierung 5
I MySQL Hibernate / MySQL alias in WHERE clause Datenbankprogrammierung 1
A WHERE datetime < (util.Date | sql.Date | sql.Timestamp | dateString) Datenbankprogrammierung 2
M Variable in SQL SELECT * FROM ... WHERE mithilfe von PreparedStatement benutzen? Datenbankprogrammierung 28
R Derby/JavaDB Select Statement Where bedingung will nicht ganz! Datenbankprogrammierung 4
B HSQLDB Probleme mit Select...Where Abfrage Datenbankprogrammierung 16
N Prepared Statement mit unbekannter Anzahl von Where-Clauses Datenbankprogrammierung 30
C MySQL Abfrage mit flexibler WHERE bedingung Datenbankprogrammierung 10
K Unkown Column in where clausel Datenbankprogrammierung 2
Y JPQL WHERE != Objekt Datenbankprogrammierung 10
J where Abfrage auf ein mysql date feld Datenbankprogrammierung 5
M Select * from mydaten where ... Datenbankprogrammierung 4
M Mysql Delete ohne Where Klausel untersagen Datenbankprogrammierung 8
M SQL-Abfrage mit where-Bedingung Datenbankprogrammierung 2
W Where-ähnliche abfrage in objektorientierter Datenbank Datenbankprogrammierung 5
S Platzhalter in WHERE Klausel Datenbankprogrammierung 16

Ähnliche Java Themen

Neue Themen


Oben