Oracle
 sql >> Base de données >  >> RDS >> Oracle

JPA et 1000 ID utilisés dans Oracle IN Operator

Contourner le IN limite est inefficace et JPA n'est pas toujours le bon outil pour le travail. Considérez ce qui suit :

  1. Des milliers de valeurs liées entraîneront potentiellement des mégaoctets de SQL. Il faudra beaucoup de temps pour envoyer ce SQL à la base de données. La base de données peut prendre plus de temps pour lire le texte SQL que pour l'exécuter selon Réponse de Tom à la question "Limite et conversion très longue liste IN :WHERE x IN ( ,,, ...)" .

  2. Il sera inefficace en raison de l'analyse SQL. Non seulement l'analyse de ce long SQL prend beaucoup de temps, mais chaque invocation a un nombre différent de paramètres liés qui seront analysés et planifiés séparément (voir cet article qui l'explique ).

  3. Il existe une limite stricte de paramètres liés dans une instruction SQL. Vous pouvez répéter le OR plusieurs fois pour contourner le IN mais vous allez atteindre la limite d'instruction SQL à un moment donné.

Pour ces types de requêtes, il est généralement préférable de créer temporary tableaux . Créez-en un avant votre requête, insérez-y tous les identifiants et joignez-le à la table d'entités de votre requête pour simuler le IN condition.

Idéalement, vous pouvez remplacer le JPA par une procédure stockée, en particulier si vous extrayez des dizaines de milliers d'identifiants de la base de données uniquement pour les retransmettre à la base de données lors de la requête suivante.