Dans JDBC, la taille d'extraction par défaut est 10, mais je suppose que ce n'est pas la meilleure taille d'extraction lorsque j'ai un million de lignes. Je comprends qu’une taille d’extraction trop basse réduit les performances, mais également si la taille d’extraction est trop élevée.
Comment puis-je trouver la taille optimale? Et cela a-t-il un impact sur la base de données, consomme-t-il beaucoup de mémoire?
Comme pour (presque) n'importe quoi, la manière de trouver la taille optimale pour un paramètre particulier consiste à analyser la charge de travail que vous essayez d'optimiser avec différentes valeurs du paramètre. Dans ce cas, vous devez exécuter votre code avec différents paramètres de taille d'extraction, évaluer les résultats et sélectionner le paramètre optimal.
Dans la grande majorité des cas, les utilisateurs choisissent une taille de recherche de 100 ou 1000, ce qui s'avère être un paramètre raisonnablement optimal. La différence de performance entre les valeurs à ce stade est généralement assez minime - vous vous attendriez à ce que la différence de performance entre les exécutions soit principalement le résultat d'une variation aléatoire normale plutôt que d'être causée par des modifications de la taille d'extraction. Si vous essayez d'obtenir le dernier iota de performances pour une charge de travail particulière dans une configuration donnée, vous pouvez certainement effectuer cette analyse. Pour la plupart des gens, cependant, 100 ou 1 000 suffisent.
Si vos lignes sont volumineuses, gardez à l'esprit que toutes les lignes que vous extrayez simultanément doivent être stockées dans le segment de mémoire Java, dans les mémoires tampons internes du pilote. Dans 12c, Oracle contient des colonnes VARCHAR (32k). Si vous en avez 50 et qu’elles sont pleines, vous obtenez 1 600 000 caractères par ligne. Chaque caractère est de 2 octets en Java. Ainsi, chaque ligne peut prendre jusqu'à 3,2 Mo. Si vous récupérez les lignes 100 par 100, vous aurez besoin de 320 Mo de mémoire pour stocker les données, ce qui ne représente qu'un seul état. Par conséquent, vous ne devez augmenter la taille de lecture anticipée que pour les requêtes qui récupèrent des lignes raisonnablement petites (taille de données réduite).
La valeur par défaut de la propriété de taille d'extraction JDBC est spécifique du pilote et 10 pour le pilote Oracle.
Pour certaines requêtes, la taille d'extraction doit être plus grande, pour d'autres plus petite.
Je pense qu’une bonne idée est de définir une taille de récupération globale pour le projet entier et de l’écraser pour certaines requêtes individuelles où elle devrait être plus grande.
Regardez cet article:
http://makejavafaster.blogspot.com/2015/06/jdbc-fetch-size-performance.html
il y a une description sur la manière de configurer la taille d'extraction globalement et de l'écraser pour des requêtes soigneusement sélectionnées en utilisant différentes approches: Hibernate, JPA, modèles Spring jdbc ou API principale jdbc. Et quelques simples benchmark pour la base de données Oracle.
En règle générale, vous pouvez:
JDBC a une taille de lecture anticipée par défaut de 10. Extraire OracleConnection.getDefaultRowPrefetch dans Javadoc JDBC