mardi 8 avril 2014

Serveurs liés : mauvaise performance ?

On entend souvent qu'il faut éviter les serveurs liés dans les requêtes, et je suis plutôt d'accord avec cette assertion. J'ai néanmoins rencontré une anecdote amusante en mission :

La requête de base est la suivante (un peu modifiée pour qu'elle soit plus lisible an cachant les champs parce que ce sont les vraies tables)


L'index cluster de la table FtDelivery est composé de Id_DimDate, Id_DimProduct, champ1, ..., Id_DimTransactionType
Le champ ValidityFlag ne fait pas partie de l'index cluster

Cette requête s'exécute sur le serveur où se trouve la table dbo.testProduit en 46s selon le plan d'exécution suivant :


L'idée d'optimisation a été de rapatrier la table testProduit directement sur le serveur lié et d'exécuter la requête sur ce dernier.

On passe donc à la requête suivante :


On l'exécute sur le serveur qui était lié. Et là, surprise, elle met 14 min en utilisant le plan d'exécution ci-dessous :


Belle optimisation n'est-ce pas ? Je supprime les serveurs liés et je multiplie par 20 les temps d'exécution.

Alors évidemment, SQL Server me propose de créer un index sur les colonnes de ma clause WHERE avec un include des colonnes du SELECT, mais cela ne m'arrange pas (la table a déjà quelques index et elle est particulièrement volumineuse. Il y a de plus plusieurs requêtes de ce type à exécuter, donc un index par requête ma paraît difficilement envisageable)

Ce qu'il est amusant de remarquer ici, c'est que le serveur lié permet de supprimer la clause WHERE coûteuse de ma requête, ce qui rend la "remote query" de mon premier plan d'exécution beaucoup plus rapide que la requête complète du deuxième plan. Tellement plus rapide que le "nested loop" s'en sort mieux qu'une jointure standard.

En d'autres termes, le serveur lié permet d'optimiser la requête.

Bon c'est une vérité qui se vérifie dans ce cas précis, loin de moi l'idée de conseiller de mettre des serveurs liés partout. Surtout que sur ce même projet et de manière générale, c'est l'inverse qui se produit.

Mais le résultat semblant paradoxal et peu naturel, je trouvais sympa de le partager.

Mise à Jour :

Comme l'histoire des statistiques dans le commentaire de Romain me travaillait, j'ai ré-exécuté en étant sûr de les avoir mises à jour.
J'en ai profité pour supprimer le cache avant l'exécution des requêtes et c'est déjà plus cohérent. L'explication est aussi plus claire.

La requête avec serveur lié s'exécute en 12min35 à la première exécution et 45s à la seconde exécution.
La requête sans serveur lié s'exécute en 16min01 à la première exécution et 45s ensuite.
C'est déjà rassurant sur le fonctionnement du cache :p

La différence de temps d'exécution tient dans la 'remote query' (bien vu Romain, je ne l'avais pas regardé en détail, je pensais qu'elle supprimait la clause pas qu'elle la transformait)

Alors que dans le cas sans serveur lié SQL Server considère plus judicieux d'utiliser l'index cluster de la table FtDelivery, la 'remote query' fonctionne par boucle sur un paramètre pour le produit (au lieu du 'in' de la requête, il boucle en utilisant un '='). De ce fait, SQL Server considère plus rapide (et c'est le cas) d'utiliser un index sur le produit existant sur FtDelivery (cf plan d'exécution ci-dessous)



Les temps d'exécutions n'ont plus un rapport de 20, par contre, on reste bien sur un temps avec serveur lié plus rapide que sans. On constate aussi que c'est bien spécifique à la construction et l'indexation de la table.


jeudi 3 avril 2014

MVP SQL Server - Merci !



J'ai attendu 3 jours après le 1er Avril pour faire un article (qu'on ne croit plus à une blague), mais si vous avez remarqué le petit logo sur la droite du blog, me voilà MVP sur les technologies SQL Server.

MVP, qu'est-ce que c'est pour ceux qui ne connaissent pas encore :

Le programme MVP (Microsoft Most Valuable Professional) vise à reconnaitre les experts indépendants et leaders de la communauté qui partagent leur passion, leur expertise technique et leur expérience des produits Microsoft sur le terrain. Il fait partie de l'engagement de Microsoft à soutenir et à enrichir les communautés techniques

 Je rejoins donc la petite dizaine d'élus français pour équilibrer les équipes entre moteur SQL et BI :

Christophe Laporte, Arian Papillon, David Baffaleuf, David Barbarin, Fred Brouard côté moteur

Romain Casteres, Jean-Pierre Riehl, Florian Eiden, François Jehl côté BI

et une pensée pour Isabelle Van Campenhoudt, notre belge francophone préférée.

Un grand merci à eux de m'accueillir dans la troupe et d'avoir pu aider ma nomination en faisant des conférences avec moi (une petite dédicace à Thomas également pour notre session aux JSS 2013) ou en disant du bien de moi par exemple (c'est pas beau de mentir). Florian, je te la dois pour une bonne partie je crois ;)

Ce programme récompense un investissement dans la communauté. donc si cet investissement est possible, c'est que la communauté SQL Server existe et est active (j'en profite pour glisser un merci à mes petits copains du GUSS). Et cette communauté, c'est vous, donc :

Un grand Merci à vous

Vous l'aurez compris, c'est un message de remerciements (j'ai l'impression d'être aux Césars), donc je fais également un coucou aux personnes avec qui j'ai pu travailler, discuter ou échanger professionnellement.

Maintenant il s'agit de ne pas se reposer sur ses lauriers, parce que l'air de rien ça ne dure qu'un an, et de continuer l'investissement. Et j'avoue que j'ai vraiment hâte d'inaugurer cette récompense lors d'une conférence (et il y en a une "exotique" et sympa qui se profile, plus de news bientôt) ou de participer au MVP Summit.



mercredi 5 février 2014

Board du GUSS, Afterwork et TechDays 14

Election du Board du GUSS

Piqûre de rappel (ou pas), si vous êtes membre du GUSS, vous avez constaté que le board de l'association se renouvelle. Les candidats sont connus, et comme l'année dernière, je souhaite en faire partie. C'est donc à vous qu'appartient la décision de me faire continuer ou pas.

Comme je l'ai expliqué dans mon message de "campagne" (sur le ton de l'humour), j'attache énormément d'importance à la communauté, et j'espère continuer sur cette lancée. On a la chance de bénéficier de professionnels impliqués et actifs sur SQL Server, et le GUSS a comme rôle de permettre à tous ces acteurs de se rencontrer, d'échanger, en un mot de se connaître.

Les différents candidats :

http://guss.pro/candidats-au-board-du-guss-2014/

Les votes se dérouleront du 10 au 24 Février, il y aura bientôt plus d'informations sur le déroulement du scrutin. Restez attentifs aux publicationx sur le site du GUSS. On compte sur vous.


Afterwork du GUSS Février 2014

Parce que même si l'élection du board est en cours, le GUSS continue d'assurer ses événements. Il y a donc un afterwork ce soir à partir de 19h au Frog (Bercy Village), métro Saint-Emilion.

Le sujet était tout trouvé vu l'actualité, il s'agit de discuter des orientations du GUSS pour l'année à venir. C'est aussi l'occasion de rencontrer une majorité de candidats au board et de discuter avec eux.


TechDays 2014

Comme chaque année, à la même période, la plus grande conférence Microsoft en France revient. Elle aura lieu la semaine prochaine les 11, 12 et 13 Février au Palais des Congrès (Porte Maillot).

Des sessions BI, des sessions Agilité, des sessions Big Data, bref pas mal de contenu à aller picorer pour tout consultant BI qui se respecte.

Une petite liste de sessions qui semble intéressantes :

Pour se mettre à jour sur l'offre Big Data chez Microsoft


Pour appréhender le Cloud



Plutôt moteur SQL



Bien sûr BI plus classique



Sans oublier un peu de méthodo agile




Bref, pas mal de choix (la liste ne se veut pas exhaustive en plus) et l'occasion de croiser du monde de l'écosystème Microsoft.

jeudi 30 janvier 2014

[SSIS] Connexions dynamiques (SQL et Analysis Services)

Un article technique, vu que ça fait un petit bout de temps que j'en ai pas écrit.

Le contexte :on a tous déjà utilisé SSIS pour faire des tâches d'administration de nos bases de données (SQL et/ou SSAS). Pour cela on configure nos connexions de manière dynamique. Et autant, ça marche plutôt bien dans le cas d'une base SQL, autant SSIS ne réagit pas de la même manière pour du SSAS.

Note : Ce qui est intéressant ici est le multi serveur. Si toutes vos bases sont sur le même serveur, il n'y a aucun problème.

Bases SQL :

Ici on va créer un package qui fait un back-up de bases de données dont le nom et la chaîne de connexion ont été renseignés dans une table (et accessoirement le répertoire de backup parce que normalement ils sont propres au serveur).



Le package sera constitué d'un SQL Task qui lit le contenu de cette table pour le mettre dans une variable de type objet, et d'un foreach qui bouclera sur ces différents noms et chaînes de connexions que l'on stocke dans des variables textes.


On utilise une expression pour définir le ConnectionString de notre connexion qui se base sur la 2ème variable.


On crée également une variable contenant la requête SQL à exécuter pour faire le back-up de nos bases.
"BACKUP DATABASE ["+ @[User::DatabaseName] +"] TO  DISK = N'"+ @[User::BackupDirectory] +"\\"+ @[User::DatabaseName] +".bak' WITH NOFORMAT, NOINIT,  NAME = N'"+ @[User::DatabaseName] +"-Full Database Backup', SKIP, NOREWIND, NOUNLOAD,  STATS = 10GO"



On exécute, on vérifie dans nos répertoires de back-up SQL, tout s'est bien passé.



Ça veut donc bien dire que SSIS réussit à rafraîchir la connexion pendant l'exécution du package, lorsqu'il s'agit d'un type Ole DB.


Bases Analysis Services :

C'est ici que ça se complique, ou plutôt que SSIS n'est pas aussi permissif avec les connexions aux bases SSAS.

On va créer un package qui processe des cubes dont le nom et la chaîne de connexion sont renseignés dans une table.


De la même manière que pour les bases SQL, on utilise un SQL Task pour lire la table que l'on ramène dans une variable objet. Et ensuite un foreach où on boucle sur les différentes valeurs que l'on stocke dans 2 variables textes (DatabaseName et ConnectionString)
On utilise enfin une expression sur la ConnectionString de la connexion SSAS en assignant la valeur de la 2ème variable (même principe que pour les bases SQL aussi)



Et ici commence les problèmes :

En exécutant le package, on obtient une erreur :


En fait, la connexion n'est tout simplement pas évaluée : Il n'y avait pas de valeur initiale dans ma variable SSASConnectionString, la chaîne est donc incorrect.

Si vous initialisez la variable avec une chaîne de connexion valide, le package va rester sur cette valeur, et donc planter sur le process devant s'exécuter sur un autre serveur.

SSIS est incapable de rafraichir dynamiquement une connexion SSAS.

J'insiste sur la note donnée en début d'article : s'il y a plusieurs bases sur un même serveur et que ce serveur sert à l'initialisation de la variable, vous n'aurez pas de soucis. C'est bien le fait de devoir changer de serveur à la volée qui pose problème.

Et une petite astuce en conclusion pour contourner le problème :

Faites des tâches de script en AMO, vous pourrez alors reconstruire la connexion dans votre script à partir de votre variable.


jeudi 2 janvier 2014

Bonne Année 2014

Vu que l'heure est aux rétrospectives (Charles-Henri et Florian notammentt), je m'y colle également.

Tout d'abord, je vous souhaite une excellente année 2014 avec plein de réussites dans vos projets personnels et professionnels.


2013, quel bilan ?

L'année 2013 a été pour moi une année riche au niveau privé pour ceux qui me connaissent personnellement avec entre autres choses, l'agrandissement de la famille ;)
Mais elle a aussi été une continuation dans mon investissement au sein de la communauté à travers le GUSS (Organisation du SQL Saturday et des Journées SQL Server 2013, et speaker lors de ces événements pour la plus grosse partie, mais également l'organisation et la participation aux afterworks).


2014, quels objectifs ?

Pour 2014, je me fixe comme objectif de sortir des outils classiques SQL Server (SSIS/SSAS/SSRS pour ne pas les citer), et de m'aventurer du côté des outils BI Self-service (tous les power quelque chose) que j'ai un peu délaissé dans un premier temps (faute de conviction, ou par non-utilisation sur mes missions actuelles). Je ne ferais que suivre notre gourou Matt Mason qui passe Product Manager côté Power Query. Il est temps de voir ce que ces nouveaux outils ont dans le ventre :)

L'autre domaine que j'aimerais approfondir est tout ce qui concerne Big Data (Il y a deux ans, je jugeais le sujet encore embryonnaire et axé marketing : Big Data, qu'est-ce que c'est ? Mais les problématiques deviennent plus claires et les outils plus matures) et particulièrement, pour rester dans le monde Microsoft, de m'amuser avec HDInsight. Je pense qu'il y a matière à se faire plaisir et, en plus, de se rapprocher d'une science qui m'intéresse toujours, les mathématiques.

Bien sûr, je continuerais mon implication dans la communauté : organiser, participer aux événements est quelque chose de très enrichissant, tant d'un point de vue humain que professionnel. Et je vais essayer d'alimenter plus régulièrement mon blog aussi :p


lundi 30 décembre 2013

Journées SQL Server 2013 : Webcast SSIS Design Patterns

Un petit message pour vous dire que les webcasts des Journées SQL Server 2013 sont désormais disponibles.

Si vous voulez revoir, notre session avec Thomas :



Si vous voulez revoir toutes les autres sessions, c'est là que ça se passe :



samedi 7 décembre 2013

Journées SQL Server 2013 : Epilogue


Voilà, les Journées SQL Server 2013 sont finies, je ne sais pas pour vous, mais pour nous l'événement a été dans sa globalité une réussite (même s'il y a toujours des points à améliorer). Encore un grand merci à nos sponsors, nos speakers et bien évidemment à tous les participants.

Au niveau des chiffres d'ailleurs, nous étions officiellement 365 professionnels de l'informatique (beau clin d’œil à la BI chez Microsoft et +20% par rapport à l'année dernière),

A titre perso, pas mal de boulot dans l'organisation sur cette édition, mais toujours avec un staff réactif (bien joué les copains) et dans une ambiance bon enfant.

Sur le contenu de l'événement, je crois qu'il y en avait pour vraiment tous les goûts cette année (à vrai dire, on a même eu des personnes nous demandant des conseils pour choisir les sessions où aller), et on a pu compter sur une cinquantaine de speakers, ce qui, si on réfléchit est juste énorme sur une seule technologie. Et ça montre également la bonne santé de la communauté.

Au sujet de notre session sur les design patterns sur SSIS, avec Thomas, on a essayé de la faire accessible. On espère qu'elle vous aura plu et que vous aurez appris quelques petits trucs. Je vous mets en lien les slides et les packages de mes démos (Thomas fera de même pour ses demo j'imagine) :

- Slides
- Packages

En conclusion, un sentiment de travail bien fait, et une forte envie de faire encore mieux l'année prochaine.