Gestion des dates en Transact SQL

Ceci est un article technique (bases de données SQL), n’hésitez pas à l’ignorer si ça ne vous intéresse pas 🙂

Depuis quelques jours nous galérons avec mon équipe à identifier une anomalie de traitement plutôt pénible dans l’ETL qui charge tous les soirs le chiffre d’affaire.

Nous avons enfin identifié l’erreur: le compte de service qui exécute le chargement le soir est configuré en américain sur la production, alors qu’il est en français sur les plateformes de développement. C’est dommage lorsqu’une date de bascule au 1er mai est interprété comme le 5 janvier en production. En effet le 05/01/2011 devient 01/05/2011 avec un format de notation américain.

Sachant que changer le paramétrage d’un compte de service en production peut prendre 3 ans de conflits politiques entre les différentes équipes (pour 2 minutes d’implémentation), nous avons décidé de faire évoluer les requêtes SQL pour qu’elles n’utilisent plus aucune conversion implicite.  L’objectif c’est de rendre le code insensible aux paramètres de langue.

En gros en SQL ça veut dire que ça c’est interdit: CAST(‘2011-05-01’ AS DATETIME), de même que référencer directement une date en chaîne de caractère : WHERE MonDateTime = ’05/01/2011′

A la place on doit faire ça : CONVERT(DATETIME,’01/05/2011′,103), ou ça : CONVERT(DATETIME,’2011-05-01′,102). En utilisant CONVERT, on peut préciser le format de la date de manière explicite: 103 pour JJ/MM/AAAA et 102 pour AAAA-MM-DD.

Ne laisser aucune conversion implicite (date ou autre) est définitivement une bonne pratique qu’il ne faut pas oublier. Pour les dates, c’est aussi une info qu’il faut savoir transmettre aux utilisateurs et MOA qui requètent les bases en SQL.

Pour plus de détail:

Recherche textuelle sur SQL Server, c’est dur!

Pour faire suite à l’article d’avant-hier, celui sur la déformation de notre vision du monde que cause les outils que l’on emploie, je voulais vous parler de la recherche textuelle sur la plateforme SQL Server. Désolé si certains sont déçus mais oui c’est un point technique 🙂

Alors pourquoi faire le lien entre cette problématique et la recherche textuelle ?

Dans une base de données on a une obsession : tout mettre dans des tables composées de lignes et des colonnes. Naturellement dans ce modèle l’unité de traitement minimale est la cellule, l’intersection d’une ligne et d’une colonne.

Très bien, mais que faire quand la cellule contient une entité unique, comme demandée par la modélisation, mais que cette entité se décompose de manière complexe ? Je pense par exemple à un descriptif produit ou un commentaire client. Comment exploiter une information humaine, un avis, une description, comprise dans une chaîne de caractère, avec des outils qui ne savent pas vraiment travailler à ce niveau de granularité ?

Et bien on fait comme on peut, mais en général ce n’est pas très joli !

Pour parler d’une situation précise, je monte actuellement une solution décisionnelle qui stocke et analyse pratiquement toutes les informations concernant le parc informatique d’un grand groupe. On pourrait penser que sur ce domaine fonctionnel on n’aurait pas de surprises dans les données: que du technique ou du numérique. Et bien détrompez-vous, remonter l’ensemble des applications installées sur les postes, sur un parc de 30’000 machines, dans 10 langues (vive l’Unicode), ça donne 3 millions de lignes à brasser par jour…

Pour vous donner un exemple : j’ai environ 1500 valeurs distinctes par jour d’applications qui contiennent le mot ‘Microsoft’, dont 500 qui contiennent le mot ‘Office’… Là dedans je dois retrouver les différentes éditions d’Office 2003 et 2007 pour faire le suivi du licensing.

Miam !

Le minimum qu’on puisse dire c’est que j’ai un problème de qualité de données. L’approche que je préfère sur ce genre de problème c’est d’utiliser les outils décisionnels pour instaurer un cycle d’amélioration des données (Tip 131):

  1. On récupère tout dans le datawarehouse avec un premier cycle d’import
  2. On flag ce qui n’est pas bon / pas encore revu
  3. On génère des rapports pour que les opérationnels puissent corriger les systèmes sources et / ou proposer des nouvelles règles d’alimentation
  4. On implémente les changements, puis retour à l’étape 1

Bien ! Le problème c’est que pour faire l’étape 2 il faut pouvoir interagir sur la donnée : est-ce que mon descriptif d’application contient ‘Office’ ? Enfin, est ce qu’il contient ‘%Office’, ‘Office%’, ‘% Office %’, ‘%Office%’… La différence ?

  • Office’ : le seul résultat qui passe c’est « Office »
  • %Office’ : « Office », « LibreOffice », « Microsoft Office »
  • Office%’ : « Office », « Office 2003 », « OfficeCracker »
  • % Office %’ : « Microsoft Office 2003», la subtilité est dans les espaces autour du mot
  • %Office%’ : toutes les possibilités

Presque facile pour Microsoft Office, mais pas pour Adobe et toutes les variations de flash, ni pour IBM, ni Mozilla, ni pour toutes les autres en fait…Et ‘0ffice’ ? ‘Offisse’ ? On peut les oublier pour des champs fournis par les éditeurs eux-même, mais pour une recherche dans des champs saisis à la main ?

Pour pouvoir traiter tous ces cas de figure on va utiliser des critères de recherche compliqués, conditionnels, qui impliquent des traitements unitaires multiples sur chacune des cellules les unes après les autres: les performances s’écroulent. En temps de réponse on passe de moins d’une seconde sur une table bien indexée à plusieurs minutes sur une recherche en ‘%…’. En fait c’est une particularité dans la manière qu’ont les bases de données relationnelles de stocker et traiter l’information qui force une lecture complète de la table à chaque fois.

On retrouve cette limite là dans tous nos outils :

Ça plus le fait qu’il faille créer toutes les règles de gestion une par une de manière exhaustive. Vivement que les IA viennent nous filer un coup de main !

Malheureusement pour le moment il n’existe pas de solution magique, une recherche textuelle étendue sur une base de données relationnelles classique aura forcément un coût important en performance et/ou un résultat foireux. La prochaine fois que vous verrez un site web équipé d’un moteur de recherche bancal, ne cherchez pas pourquoi… Et c’est là que le bas blesse: à force de galérer avec ce type d’opérations on ne les propose plus, on ne les implémente plus, et on en vient à penser qu’elles ne sont pas possibles.

Pourtant Google y arrive, et sur des volumes de données autrement plus important! C’est d’ailleurs pour ça que pour l’avenir j’ai espoir dans la prochaine génération de bases avec moteur de stockage en colonne / vertical. Va bien y avoir un génie quelque part qui va nous révolutionner les recherches textuelles là-dessus!

Un problème de Connection String?

Désolé mais c’est un point purement technique. Faut dire que de temps en temps ça fait pas mal non plus! 😉

Pour tout ceux qui ont un problème pour joindre une base de données, je leur conseille d’utiliser ce site absolument merveilleux qu’est ConnectionStrings.com, c’est magique!

Il référence la plupart des formats et options pour formater sa chaîne de connexion, ça m’a encore tiré du pétrin aujourd’hui!

SQLPASS 2010 – Journées 2 et 3

Oh mon dieu! Il s’en est passé des choses en 2 jours! C’est la révolution 🙂

D’abord SSIS, qui d’après Jamie Thomson ne change pas beaucoup en dehors de la refonte de l’interface dans VS2010:

Ensuite SSAS, qui lui explose dans tous les sens:

Vous avez remarqué comme le powerpivotiste aime et le pro-mdx n’aime pas?

Pour voir pourquoi, il faut comprendre que désormais les deux fonctions du datawarehousing (stockage longue durée et analyse/restitution) sont vraiment séparées dans les produits Microsoft.

En stockage longue durée on a SSIS pour l’alimentation et SQL Server (dB Engine) pour le stockage. Les deux produits sont matures, de très bonne qualité et reconnus sur le marché. Pas de débat là dessus.

C’est point de vue analyse et restitution que ça change beaucoup. Avant (enfin maintenant quoi…) on avait trois possibilités pour faire le job:

  • Source SQL Server restituée dans SSRS: facile (SQL) mais pas optimisé pour 2 sous
  • Source SSAS restituée dans SSRS: complexe autant dans le langage de requête (MDX) que dans l’incapacité chronique des 2 softs à tourner ensemble, mais super performant
  • Source SSAS restituée dans Excel: sympa mais uniquement pour les gros joueurs d’Excel qui veulent jouer avec la donnée

Ce sont ces schémas qui évoluent pour passer à deux nouvelles manières d’organiser les données en source, que tous les outils de reporting devraient être capable de requêter:

  • La nouvelle vision, le BISM (BI Semantic Model), qui est une vue relationnelle des données, qui utilise le moteur VertiPaq et le langage DAX
  • La vision actuelle, l’UDM (Unified Data Model), qui est la vue multidimensionnelle qu’on connait déjà, utilisant le moteur SSAS « classique » et le langage MDX

En image ça donne ça:

Bon bin c’est super en fait! Ça nous donne une nouvelle corde à notre arc sans éclater l’existant, en fait c’est chouette!

Sauf que… Sauf que le nouveau SSRS (Project Crescent) est DAX only, tout comme l’est PowerPivot, et qui dit PowerPivot dit Excel et SharePoint à moyen terme. Ça ne laisse donc que l’éco-système hors Microsoft pour s’occuper du MDX à moyen terme. Juste quand le langage commence à gagner de la traction chez les autres vendeurs. Ça ressemble beaucoup à du fire and motion tout ça. C’est pas joli-joli!

On comprend donc que les experts SSAS tirent la tronche et les experts PowerPivot sabrent le champagne 😉

Et pour nous commun des mortels? Personnellement je suis plutôt optimiste, je cite Rob Collie (ancien program manager SSAS quand même) dans l’article que j’ai linké plus haut:

The SQL team at MS has long had three teams in the BI space:  SSAS, SSRS (Reporting Services), and SSIS (Integration Services).  Both AS and RS got along great with IS, but in all honesty, AS and RS have behaved more like rivals for as long as I can remember.

Well, a number of the personalities behind the scenes that were responsible for that competitive vibe have departed.  And the results are resoundingly positive – the two teams are now cooperating.  Fully.

Donc pour la première fois les équipes SSAS et SSRS bossent main dans la main. Vu le talent de ces équipes, personnellement j’ai confiance 🙂

SQLPASS 2010 – Première journée

Qu’est ce que le SQLPASS? Ce n’est rien d’autre que la plus grande messe SQL Server réalisée par une organisation qui n’est pas Microsoft. En effet cette conférence est organisée par le PASS (Professionnal Association for SQL Server) dont l’antenne en France est le GUSS (Groupe des Utilisateurs de SQL Server).

Bien qu’elle ne soit pas réalisée par Microsoft, la société y est bien présente, et on y apprend pas mal de nouveautés sur ce qui nous attend dans la prochaine version de SQL Server (SQL11, nom de code Denali).

Si ça vous intéresse, n’hésitez pas à suivre Christian Robert qui nous rapporte en français sur son blog ce qui se trame là bas.

Personnellement j’ai apprécié le résumé de la première journée faite par Chris Webb, qui comme François Jehl se concentre sur les nouveautés BI qui sont:

  • L’intégration du moteur Vertipaq (stockage verticale) dans SQL Server, voir l’article de Chris Webb pour ce que cela signifie point de vue usage.
  • PowerPivot devrait recevoir une nouvelle version plus « pro », on en saura plus dans les jours qui viennent.
  • L’équipe SSRS nous pond un nouvel outil de reporting ad-hoc: Project Crescent.
  • SSIS qui évolue autant sur le moteur que sur l’interface, Jamie Thomson en fait le détail.

En tout cas ça fait plaisir de voir que ça bouge enfin, même si pour le moment j’ai un peu du mal à percevoir la stratégie globale qui se cache derrière tout ça.