Archive

Archive for février 2013

TechDays 2013 – Après les sessions

J’avoue, le matin du deuxième jour (faisait froid, en plus), j’ai eu la flemme.
Du coup, j’ai suivis le live bien au chaud (et c’est pour ça que je n’ai pas fait de billet dessus, d’autant plus que les sessions m’intéressaient moins.

Par contre, et c’est l’objet du billet, les trois lives sont disponibles :
Jour 1 – Mardi 12 février
Jour 2 – Mercredi 13 février
Jour 3 – Jeudi 14 février

Et une petite phrase intéressante, dans le mail de L’équipe des TechDays 2013 que j’ai reçu :

A partir de mi-mars, vous pourrez revoir les vidéos de l’ensemble des keynotes et sessions des TechDays 2013 sur ce même site.

Publicités

TechDays 2013 – Jour 1

Aujourd’hui, c’est le premier jour des Tech Days 2013.
Comme l’année dernière, ce qui frappe en premier lieu (mis à part qu’il fait moins froid), c’est qu’il y a toujours autant de monde.

Donc, aujourd’hui, je devais faire six séances (du moins, c’était marqué dans mon agenda), mais force est de constater qu’après déjà quatre, j’ai du jeter l’éponge : la foule, ça me saoule bien plus que mon intérêts pour les sessions… Ça, la chaleur, le monde, le fait qu’il y a pas eu beaucoup d’annonces tonitruantes (mais bon, l’année dernière, y avait du contenu) et surtout la foule. Mais je crois que je l’ai déjà mentionné ^^

Bref, j’ai fais :

  • La plénière : Développeurs, c’est vous le chef !!
  • Plongée au coeur du Framework .NET 4.5
  • Introduction au développement Windows Phone 8
  • Développer pour tous les navigateurs

Allez, petit retour, donc.

Lire la suite…

Traiter les données dans le code ou en base ?

Cela fait plusieurs fois que je vois de gros traitements de manipulation de données directement dans le code.

A chaque fois, il y a eu des variations, mais en règle générale, c’est un algorithme plus ou moins comme cela :

Récupération des données depuis la base de données.
Pour chaque ligne récupérée.
     Si le champX est égale à "variable1", alors on lance la procédure "procedure1" pour cette ligne.
     Si le champX est égale à "variable2", alors on lance la procédure "procedure2" pour cette ligne.
     Si le champX est égale à "variable3", alors on lance la procédure "procedure3" pour cette ligne.
     Sinon, on lance la procédure "procedure4" pour cette ligne.

Le tout avec du if, else if, esle (ou un switch, c’est selon), parfois d’autres boucles à l’intérieur de la première (forception, foreachception ou whileception, si je puis dire).

Comme je l’ai dis, il y a des variantes, mais cependant, si les causes sont différentes, l’effet reste le même : c’est pas performant.
Voir pire, ça occasionne des timeout vis-à-vis de la base de données.

Mais, alors, que faire ?
Le traitement ensembliste. En base de données.
Voilà, c’est tout.

Alors, je sais que parfois, la base ne doit être utilisée que pour stocker les données (sic…) et que le code métier ne doit se trouver qu’en un seul et unique endroit (sic bis…), que la base de données ne doit pas contenir d’intelligence (sic ter…).

Mais parfois (souvent ?), c’est juste très con de vouloir procéder comme cela.
Bon, l’avantage, c’est quand même que c’est tellement à la ramasse qu’optimiser n’est pas très compliqué… (en fait, l’étape « ohmondieucesthorrible » est plus longue à gérer).

Quand on a un SGBDR, il ne faut pas oublier que le G, c’est pour Gestion.
C’est autant de la gestion des base de données que de données elles-mêmes.
En somme, les SGBDR sont fait pour traiter de la données !!!

Comment on fait, du coup ?
A chaque fois que j’ai eu ce problème, il a été résolu avec des tables temporaires.
En somme, récupération des données vers une table temporaire, puis traitement des données depuis cette table en reprenant les conditions mentionnées plus haut.
Donc, j’ai du :

UPDATE #MaTable
SET ChampY = "Valeur1"
WHERE ChampX = "variable1"

Et là, miraculeusement (ou pas), au lieu de traiter les lignes une par une, le SGBDR va traiter toutes les lignes.

Après, il faut quand même réfléchir un peu à comment on peut procéder, mais il est tout à fait possible de gérer les données de cette manière.

Un exemple ?
Là, j’ai un traitement qui doit gérer 70.000 lignes.

C’est pas une volumétrie très importante, mais le traitement via code dure 20 minutes avant que la connexion à la base de données ne parte en timeout.
Avec les traitements ensemblistes, la même volume de données (c’est à dire le MÊME cas de test) dure…environ 15 secondes.

Oui, oui, 15 secondes.
Et même en purgeant le cache de SqlServer (pour info).
DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE

Sur d’autres cas de tests, le gain de temps varie d’un facteur 1 (pour les très petits volumes) à 10 (pour les volumes plus importants et mixtes).
Le coup des 15 secondes est sur un scénario assez précis et j’avoue que…eh bien, je m’attendais pas à un tel gain ! ^^

J’ai pourtant 8 insertions de différents types (et différentes provenances) dans ma table temporaire, 18 updates différents puis insertion des données (conditionnées) dans une table physique et modification de deux autres tables (dont l’un compte plus de 67 millions d’entrée).

 
 
Alors OUI aux traitements de masse des données dans la base de données et NON aux mêmes traitements dans le code !!!

Catégories :Développement, Humeur, SGBDR