164 votes

Quel est le meilleur ? Effectuer des calculs dans sql ou dans votre application

shopkeeper tableau a champs suivants:

id (bigint),amount (numeric(19,2)),createddate (timestamp)

Disons, j'ai le tableau ci-dessus. Je veux obtenir les enregistrements d'hier et générer un rapport par le virement de la somme imprimé pour cents.

Une façon de le faire est de réaliser des calculs dans mon application java et exécuter une requête simple

Date previousDate ;// $1 calculate in application

Date todayDate;// $2 calculate in application

select amount where createddate between $1 and $2 

et puis la boucle à travers les documents et de les convertir montant de centimes dans mon application java et de générer le rapport

Une autre façon, c'est comme réaliser des calculs dans une requête sql elle-même:

select cast(amount * 100 as int) as "Cents"
from shopkeeper  where createddate  between date_trunc('day', now()) - interval '1 day'  and  date_trunc('day', now())

et puis la boucle à travers les documents et de générer le rapport

Dans un sens , tous mes le traitement est fait dans l'application java et une simple requête est déclenché. Dans d'autres cas, tous les conversions et calculs est faite dans la requête Sql.

Ci-dessus le cas d'utilisation est juste un exemple, dans un scénario réel un tableau peut avoir plusieurs colonnes qui nécessitent le traitement de la même nature.

Pouvez-vous svp me dire quelle approche est la meilleure en termes de performances et d'autres aspects et pourquoi?

212voto

Marc Gravell Points 482669

Cela dépend de beaucoup de facteurs, mais plus important encore:

  • la complexité des calculs (préférer faire des complexes croquer sur une application serveur, étant donné que les échelles de sortir; plutôt que d'un serveur de base de données, où les échelles jusqu')
  • le volume de données (si vous avez besoin d'accéder à regrouper un grand nombre de données, le faire au serveur de base de données permettra d'économiser de la bande passante, et les e / s de disque si les agrégats peuvent être effectués à l'intérieur d'un index)
  • commodité (sql n'est pas le meilleur langage pour des complexes de travail - surtout pas génial pour la procédure de travail, mais très bon pour le travail; moche, erreur de manipulation, tout de même)

Comme toujours, si vous n' apportez les données à l'application-serveur, de minimiser les lignes et les colonnes seront à votre avantage. Faisant que la requête est à l'écoute et correctement indexé permettra soit le scénario.

Re votre note:

et puis la boucle à travers les enregistrements

En boucle par le biais d'enregistrements est presque toujours la bonne chose à faire en sql - la rédaction d'un ensemble de base de fonctionnement est préféré.

En règle générale, je préfère garder la base de données de travail à un minimum de "stocker ces données, extraction de données" - cependant, il y a toujours des exemples de scénarios où un élégant requête au serveur permet d'économiser beaucoup de bande passante.

Aussi pensez-y: si c'est gourmand en ressources, peut-il être mis en cache quelque part?

Si vous souhaitez une précision ", ce qui est mieux"; le code de deux manières et les comparer (à noter qu'un premier projet de soit n'est probablement pas à 100% à l'écoute). Mais le facteur d'utilisation typique: si, dans la réalité, il est appelé 5 fois (séparément) à la fois, puis de simuler l': ne comparez pas un seul "1 de ces vs 1 de ces".

86voto

Erwin Brandstetter Points 110228

Permettez-moi d'utiliser une métaphore: si vous souhaitez acheter un collier en or à Paris, l'orfèvre pouvait s'asseoir dans la Ville du Cap, à Paris, c'est une question d'habileté et de goût. Mais vous auriez jamais navire de tonnes de minerai d'or en Afrique du Sud de la France. Le minerai est traité sur le site minier, l'or est expédié. La devrait en être de même pour les applications et les bases de données.

Aussi loin que PostgreSQL est concerné, vous pouvez faire presque n'importe quoi sur le serveur, de manière assez efficace. Le SGBDR excelle à des requêtes complexes. La procédure besoins, vous pouvez choisir parmi une variété de script côté serveur langues: tcl, python, perl et beaucoup plus. J'utilise des plpgsql.

Pire des cas, à plusieurs reprises d'aller sur le serveur pour chaque ligne d'un ensemble plus vaste. (Ce serait comme d'expédition d'une tonne de minerai de temps.)
En seconde ligne, si vous envoyez une cascade de requêtes, chaque fonction sur l'avant, alors que tout pourrait être fait dans une requête ou d'une procédure sur le serveur. (C'est comme le transport maritime, de l'or, et chacun des bijoux avec un autre navire.)

Va-et-vient entre l'application et le serveur est cher. Essayez de couper vers le bas sur le, et vous permettra de gagner - ergo: utilisation côté serveur procédures et / ou sophistiqué SQL si nécessaire.

Nous venons de terminer un projet dans lequel nous avons mis près de toutes les requêtes complexes dans des procédures stockées. L'application des mains sur les paramètres et obtient les ensembles de données dont il a besoin. Rapide, propre, simple (pour le développeur de l'application), I/O réduite au minimum ... un joli collier avec une faible empreinte carbone.

20voto

James Anderson Points 18253

Dans ce cas, vous êtes probablement légèrement mieux de faire le calcul dans SQL en utilisant le moteur de base de données est susceptible d'avoir un plus efficace arithmétique décimale routines de Java.

Généralement, bien que pour la ligne de niveau de calculs, il n'y a pas beaucoup de différence.

Où il y a une différence est:

  • Les calculs d'agrégats comme SUM(), AVG(),MIN(), MAX() ici, le moteur de base de données sera un ordre de grandeur plus rapide que Java mise en œuvre.
  • N'importe où le calcul est utilisé pour filtrer les lignes. Le filtrage à la DB est beaucoup plus efficace que la lecture d'une ligne, puis le jeter.

12voto

Lukas Eder Points 48046

Il n'y a pas de noir / blanc à l'égard de ce que les parties de la logique d'accès aux données doit être effectuée dans le SQL et quelles parties doivent être effectuées dans votre application. J'aime Marc Gravel est libellé, la distinction entre les

  • des calculs complexes
  • de données-calcul intensif

La puissance et l'expressivité de SQL est fortement sous-estimée. Depuis l'introduction de fonctions de la fenêtre, beaucoup de non-strictement orientée sur un ensemble de calculs peuvent être réalisées très facilement et avec élégance dans la base de données.

Trois règles de base doivent toujours être respectées, indépendamment de l'ensemble de l'architecture de l'application:

  • garder la quantité de données transférées entre base de données et l'application slim (en faveur de calcul des trucs dans la DB)
  • garder la quantité de données chargées à partir du disque par la base de données slim (en faveur de laisser la base de données d'optimiser les instructions pour éviter l'accès aux données)
  • ne poussez pas la base de données à son PROCESSEUR limites complexes, calculs simultanés (en faveur de l'extraction de données dans la mémoire de l'application et de l'exécution des calculs)

Dans mon expérience, avec une bonne DBA et certains bons de connaissances au sujet de votre décent de base de données, vous ne rencontrerez pas de votre DBs les limites du PROCESSEUR très bientôt.

Certains plus de la lecture où ces choses sont expliquées:

2voto

Davide Piras Points 28708

En général faire les choses dans SQL si il y a des chances qu’aussi d’autres modules ou du composant dans la mêmes ou d’autres projets devront obtenir ces résultats. une opération atomique faite côté serveur est également mieux parce que vous avez juste besoin d’appeler la procédure stockée de n’importe quel outil de gestion db pour obtenir les valeurs finales sans traitement supplémentaire.

Dans certains cas, cela ne s’applique pas, mais quand il le fait, il est logique. en général la boîte db a aussi le meilleur matériel et performances.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X