Nous développons une application avec une couche de persistance utilisant OpenJPA1.1 et une base de données Oracle comme stockage backend. J'utiliserai des requêtes avec des sous-sélections (voir ma question au Solving JPA query finding the last entry in connected list). Maintenant, mes collègues au travail remarquent que de telles requêtes peuvent conduire à des problèmes de performances car la base de données est remplie de milliers de données clients utilisées par quelques milliers d'utilisateurs simultanés (ce qui sera la réalité en production). Donc, ma question est la suivante: y a-t-il une «meilleure pratique» utilisant des sous-sélections dans les requêtes dans ces circonstances? Et qu'est-ce qui doit être considéré en faisant cela?Que devrait-on considérer en utilisant des sous-sélections dans les requêtes avec des bases de données chargées par le passé?
Répondre
Je voudrais d'abord prouver que c'est un problème. Vous voudrez charger la base de données avec des données factices et voir comment vos requêtes s'exécutent au fur et à mesure que la base de données s'agrandit. Sinon, vous passez du temps à optimiser quelque chose qui ne pose peut-être pas de problème.
Une chose à laquelle penser. Dans tous les endroits où j'ai travaillé, où les choses se décomposent, ce ne sont pas des milliers de disques, mais des millions. Vous avez ce système, et il fonctionne bien pendant un certain temps, puis commence à ralentir même si vous y mettez plus de matériel. L'endroit où je travaille a maintenant environ 70 millions d'enregistrements dans son tableau d'histoire remontant à 1998. Le rendement de certaines requêtes est horrible en conséquence et ils passent beaucoup de temps à contourner ces problèmes.
Mais à un moment donné, vous devez vraiment demander. Devons-nous conserver les données de plus de 4 ans dans notre système transactionnel? Ou même 4 mois? Cette limite de temps dépend des besoins de votre entreprise, mais si vous conservez votre système transactionnel uniquement avec les données nécessaires pour traiter le travail en cours ... et archivez dans un entrepôt de données vos enregistrements historiques. Vous améliorerez vos performances globales, car il est fort probable que vous ayez besoin d'interroger ces anciennes données, alors pourquoi les conserver avec vos données récentes?
Si vous pensez à cela à l'avance, vous économiserez beaucoup de maux de tête à long terme.