Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Verwendung von JPA und 1000 ID in Oracle IN Operator

Umgehen des IN Limit ist ineffizient und JPA ist nicht immer das richtige Werkzeug für den Job. Beachten Sie Folgendes:

  1. Tausende von gebundenen Werten führen möglicherweise zu Megabytes an SQL. Es wird lange dauern, dieses SQL an die Datenbank zu senden. Die Datenbank braucht möglicherweise länger, um den SQL-Text zu lesen, als ihn gemäß Toms Antwort auf die Frage "Grenze und Konvertierung sehr lange IN-Liste:WHERE x IN ( ,,, ...)" .

  2. Es wird aufgrund der SQL-Analyse ineffizient sein. Es dauert nicht nur lange, dieses lange SQL zu parsen, sondern jeder Aufruf hat eine andere Anzahl gebundener Parameter, die separat geparst und geplant werden (siehe dieser Artikel, der es erklärt ).

  3. Es gibt eine feste Grenze für gebundene Parameter in einer SQL-Anweisung. Sie können das OR wiederholen ein paar Mal, um den IN zu umgehen Limit, aber Sie werden irgendwann das Limit der SQL-Anweisung erreichen.

Für diese Arten von Abfragen ist es normalerweise besser, temporär zu erstellen Tabellen . Erstellen Sie einen vor Ihrer Abfrage, fügen Sie alle Bezeichner ein und verbinden Sie ihn mit der Entitätstabelle in Ihrer Abfrage, um den IN zu simulieren Bedingung.

Im Idealfall können Sie die JPA durch eine gespeicherte Prozedur ersetzen, insbesondere wenn Sie Zehntausende von Kennungen aus der Datenbank ziehen, nur um sie bei der nächsten Abfrage an die Datenbank zurückzugeben.