2010-03-09 7 views
4

Je transfère environ 350 lignes (avec une certaine collecte de données) d'un serveur MS SQL vers l'iSeries pour traitement. Je pense que le processus est trop lent, soit environ une minute. Je fais toutes les choses MS SQL dans LINQ2SQL. Voici les bases de ce que je fais actuellement:Accélération des requêtes avec LINQ

  1. Recueillir l'ensemble des données de base du véhicule pour traiter un à-un-temps.
  2. SOMME() Consommation de carburant par véhicule
  3. SOMME() La consommation d'huile par véhicule
  4. SOMME() des pièces utilisées par véhicule
  5. SOMME() du travail par véhicule
  6. SOMME() Réparations extérieur par véhicule
  7. SOMME() coûts d'accident par véhicule

Je sais que cela est beaucoup de requêtes, mais la plupart d'entre eux sont des tables différentes dans la MS SQL Server. Tout cela nécessite au moins une jointure. Je pense à joindre Oil et Parts à une requête et à Outside Recairs and Accident Costs en une seule requête car ces deux éléments sont stockés dans les mêmes tables et voient si cela améliore les performances.

Avez-vous d'autres suggestions? Notez qu'il s'agit d'un produit fourni par le fournisseur et que je préférerais ne créer aucune procédure ou vue stockée (qui en fait n'existe pas) qui ne se trouve pas déjà dans la base de données.

Mise à jour: J'ai eu another post en regardant des alternatives à l'amélioration de la vitesse.

+2

350 lignes est à peine une quantité imposante de données. Avez-vous exécuté une trace SQL pour voir ce que TSQL est en train d'exécuter? Pourrait être N + 1 ou similaire? –

Répondre

0

Il semble que la base de données ait été mal conçue. Tout ce que LINQ générait en arrière-plan était un code très inefficace. Je ne dis pas que le LINQ est mauvais, c'était juste mauvais pour cette base de données. Je me suis converti en une configuration .XSD rapidement lancée et le temps de traitement est passé de 1,25 minutes à 15 secondes. Une fois que j'ai fait une refonte appropriée, je peux seulement deviner que je vais raser quelques secondes de plus. Je vais essayer de nouveau LINQ un autre jour sur une meilleure base de données.

+0

Cela, je ne pourrais pas savoir puisque aucun diagramme de base de données relationnel n'a été illustré dans votre question. Merci malgré pour me le faire savoir, c'est très apprécié.Devrais-je faire face à une autre question similaire, je penserai à votre situation et la suggérerai dans une autre réponse, ou même pour mes propres projets. Merci Mike! Bonne journée! =) –

5

Vous pourriez peut-être lancer ces requêtes dans des threads séparés et attendre leur retour? Ensuite, tous vos calculs se feraient à peu près en même temps que pour, disons, la moitié du temps qu'il faut maintenant, je suppose. Regrouper vos résultats par table est une bonne idée à mon point de vue car vous traitez déjà ces données.

Grouper vos requêtes par table et les lancer dans des threads différents serait à coup sûr un gain de performance. Tout dépend si c'est optimal pour votre situation.

+0

Désolé, cela n'a pas fonctionné dans ce cas. Voir ma réponse pour mes conclusions. +1 pour une bonne réponse me désignant une direction à laquelle je n'avais pas pensé. –

0

Si les performances sont importantes (une minute est un problème?), Vous pouvez envisager d'utiliser un tableau récapitulatif. Ensuite, il vous suffit d'interroger le tableau récapitulatif de votre rapport. La table récapitulative peut être construite avec des déclencheurs ou avec une extraction par lots nocturne dans la table récapitulative.

+0

Je ne sais pas de quel monde vous venez, mais je viens du monde iSeries où si vous clignez des yeux, vous ratez ce programme même en cours d'exécution. C'est en dessous de 400 lignes, c'est presque rien à traiter. Je n'aurais eu aucun problème s'il s'agissait de centaines de milliers de lignes. D'ailleurs, je l'ai maintenant réduit à 5 secondes. Lequel préférez-vous ?? –