Archive

Archive for janvier 2014

Optimisations C#, Entity Framework et Sql

Ça fait un petit moment maintenant que je fais des tests de charges.
Le code n’était pas toujours optimisé au mieux, ce qui m’a posé divers problèmes : timeouts sur la base de données, explosions des requêtes Linq to Entities, Entity Framework à la ramasse…

Bref, j’ai du modifier pas mal de choses pour arriver à un résultat plus acceptable.
Dans ce billet, ce sera juste la situation générale et les liens vers les billets détaillant la résolution.

Dans un premier temps, voici grosso modo l’algorithme :

  1. Préparation du traitement
    1. Récupération des informations pour paramétrage
    2. Récupération de données de références pour les modifier et créer de nouvelles données
    3. Création en base des données de test
    4. Création d’un fichier en entrée
  2. Lancement du traitement
    1. Lecture du fichier
    2. Conversion du fichier en objets
    3. Validation des lignes
    4. Récupération des données complémentaires (connecté à la BDD)
    5. Création des nouvelles entrées (déconnecté)
    6. Insertion en base de données (transactionnel)
  3. Validation du test
    1. Récupération des lignes générées en BDD
    2. Validation des lignes

Si pour un test sur 500 lignes (quelques secondes), ça passe pas trop mal, sur 50.000, c’était pas franchement le même succès (près de 10 minutes).

Les points majeurs d’achoppement se situaient sur la récupération de la donnée de référence (point 1.2); insertion en base des données de test (les 50.000 lignes, point 1.3); récupération des données complémentaires (point 2.4) et enfin l’insertion en base de données des lignes traitées (2.6).

Pour les points 1.3 et 2.6, c’est le Bulk Insert qui m’a sauvé.
J’en ai parlé ici : [C#] Entity Framework et Bulk Insert.

Pour le point 1.2, c’est du SQL avec le hint FORCESEEK : [C#-TSQL] FORCESEEK et Entity Framework.

Et enfin, pour le point 2.4, c’est les requêtes compilées d’EF 5 : [C# EF5] Requêtes Compilées.

Au final, 50.000 lignes sont maintenant traitées en moins de 3 minutes (le scénario complet).
C’est plutôt pas mal, d’autant que le DBA m’a demandé de mettre quelques temporisation pour laisser respirer un peu la base de données (et permettre aux autres applications de tourner) ^^

Catégories :.Net, Développement, Sql Server

[C#-TSQL] FORCESEEK et Entity Framework

Ce billet fait suite à la petite série sur l’optimisation.
La situation est expliquée ici Optimisations C#, Entity Framework et Sql, donc je n’y reviendrais pas.

Ce présent billet va traiter du hint FORCESEEK sur SQL Server et comment l’utiliser avec Entity Framework.

Lire la suite…

Catégories :.Net, C#, Développement

[C#] Entity Framework et Bulk Insert

Aujourd’hui, j’ai eu un problème avec Entity Framework sur mes tests de charges : je dois insérer 50.000 lignes sur trois tables différentes. VDM.

Ça résume plutôt bien le postulat de base.
En pratique, je travaille avec Entity Framework.
J’ai en input un certain volume de données (dont j’ignore à priori le volume en question), après les avoir transformer, je mets tout en base de données.
Pour le moment, l’objectif est de traiter 500 lignes. Donc, pour les tests de charges, on a prit un facteur 100, 50.000 lignes, donc.
Du coup, je me retrouve à la fin du traitement avec des tables où insérer entre 1 et 20 lignes, mais trois tables où insérer 50.000 lignes.
Le tout au sein d’une transaction pour assurer la cohérence des données.

J’ai bien pensé à faire deux transactions, mais ce n’est réellement pas un choix pertinent car en cas de plantage de la deuxième, je dois faire une passe sur la base pour supprimer les données de la première transaction… Et rien n’assure qu’il ne pourrait pas y avoir de plantage lors du nettoyage suite au plantage…

Lire la suite…

Catégories :.Net, Développement

Bilan 2013

Pour commencer, bonne année à tous, avec tout plein de bonnes choses dedans !

L’année est passée assez vite, elle a été bien nourrie avec plusieurs projets chronophages, mais au final, ce fut une bonne année.
Voici donc le bilan de ce blog.

Lire la suite…

Catégories :Divers