7 Stimmen

Oracle mit Beschränkung auf 1000 / Hibernate

Oracle kennt die Begrenzung auf 1000 Elemente in der where a in (..) Klausel. Besteht diese Einschränkung auch bei der Verwendung von Hibernate in Verbindung mit Oracle?

5voto

Tendayi Mawushe Punkte 24821

Diese Datenbankbeschränkung besteht auch bei Hibernate. Wenn Sie wirklich mehr als 1000 Elemente in Ihrer in-Klausel benötigen, müssen Sie die Liste selbst im Code aufteilen und die Abfrage für jeden Block mit 1000 Schlüsseln ausführen und dann die Ergebnismengen aneinanderhängen.

Beachten Sie, dass dieser Hack nicht funktioniert, wenn Ihre Abfrage sortiert oder anderweitig die Ergebnisse der Abfrage aggregiert werden müssen, da der vollständige Satz von Ergebnissen nur im Code bekannt sein wird. In diesem Fall ist es besser, einen anderen Weg zu finden, die Abfrage zu schreiben, der keine IN Klausel.

1 Stimmen

Eine andere Möglichkeit wäre, die mehr als 1000 Werte in einer globalen temporären Tabelle in der Datenbank zu speichern und die beiden Tabellen zu verbinden. Datenbanken sind sehr gut im Zusammenführen von Tabellen :)

0 Stimmen

Genau, lassen Sie die Datenbank die Arbeit machen! Die Aufteilung ist eine wohlbekannte Lösung, die aber darauf hinweisen sollte, dass Sie Ihren Ansatz überdenken müssen.

0 Stimmen

Eine andere Alternative ist die ODER-Verknüpfung der 1000 Elemente in Gruppen. Auf diese Weise können Sie "ORDER BY" auf die quiry.

3voto

Patrick Hammer Punkte 1150

Wir hatten das gleiche Problem und lösten es, indem wir es in 100er Pakete der IN-Klausel aufteilten

select * from mytable where id in (...) or id in (...).

Bemerkung:

  • stellen Sie sicher, dass Sie Bindungsvariablen verwenden
  • dafür sorgen, dass die Abfrage immer gleich aussieht. Dazu werden die IN-Klauseln mit -1 aufgefüllt, bis sie 100 Elemente enthalten
  • versuchen, immer die gleiche Anzahl von ORed in(...) zu verwenden, damit die Abfrage immer gleich aussieht

Warum wollen Sie die oben genannten Punkte? Damit der Abfrageoptimierer den Abfrageplan wiederverwenden kann.

Zusätzliche Optimierung:

  • Anstatt -1 zu verwenden, können Sie einfach wieder den letzten wahren Wert verwenden. Das ist sogar noch ein bisschen besser.

Beispiel: in(1, 2, 3, 4, 4, ..., 4)

Anmerkung: Wir haben mit verschiedenen festen Zahlen von Elementen in der in-Klausel getestet und bei mehr als 100 Elementen Leistungseinbußen festgestellt.

0 Stimmen

PS: Wenn die Sql-Anweisung, die die Werte innerhalb der IN-Klausel zurückgibt, bekannt ist, können Sie auch erwägen, Ihre IN-Anweisung durch eine EXISTS-Anweisung zu ersetzen.

2voto

mmmmmm Punkte 31394

Ja, denn Hibernate ruft irgendwann Oracle auf, so dass die Grenze die niedrigste der Grenzen in Hibernate und Oracle ist.

Hibernate macht nichts Besonderes mit den Daten für ein in - übergibt sie einfach an die Datenbank

1voto

Christian Punkte 11

Es scheint ein Fehler in Hibernate zu sein:

http://opensource.atlassian.com/projects/hibernate/browse/HHH-1123

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X