Business Geek

Aller au contenu | Aller au menu | Aller à la recherche

lundi 9 juin 2008

Premiers pas dans l'espace

Il y a plusieurs semaines, j'ai terminé un article d'introduction aux fonctionnalités spatiales de SQL Server 2008. Voici quelques extraits pour vous mettre en appétit. Et pour aller directement sur l'article complet :

      Premiers pas dans l'espace (www.bewise.fr)

Introduction
Cet article se veut une première introduction aux nouveaux types spatiaux de SQL Server 2008. Je vais vous les présenter et nous les manipulerons. Nous aborderons aussi leur utilisation avec du code .NET. Enfin, nous utiliserons Virtual Earth pour présenter les données géographiques mais nous ne rentrerons pas dans le détail de cette technologie.

[...]

Premières requêtes
Les 2 nouveaux types proposent toute une série de méthodes pour manipuler des données spatiales. Aire de la surface, surface circonscrite, inscrite, périmètre, intersection, union, barycentre… Le but n’est pas de vous les décrire ici une à une. Nous allons toutefois en utiliser quelques unes dans des requêtes simples mais indispensables dans une application gérant des types spatiaux.

Tout d’abord, voyons comment retrouver les points contenus dans une zone donnée. Comme cas concret, on peut imaginer une recherche d’appartements ou d’hôtels dans une zone définie. Pour cela, nous avons plusieurs possibilités avec les méthodes STContains, STIntersects et STWithin. La méthode STIntersects serra utilisée pour le type geography car les 2 autres n’existent que sur le type geometry. Voici le code T-SQL permettant cette requête :

Declare @zone geography = geography::STPolyFromText('POLYGON((43 3.2, 43 3.5, 43.2 3))', 4326)

Select *
From CustomerPlaces
Where @zone.STIntersects(CustomerPlaces.Localization) = 1

[...]

ADO.NET
Après avoir vu un aperçu des types spatiaux et de leur utilisation dans SQL dans Management Studio, intéressons nous à la manipulation depuis une application .NET.

[...]

Et comme d'habitude, n'hésitez pas pour les questions...

SQL Server 2008 RC0

On y est presque... Ce n'est pas encore la RTM mais on s'en approche. La 1ère Release Candidate (RC0) de SQL Server 2008 est disponible pour les abonnés MSDN et Technet. Cette version a normalement le même périmètre que la version finale.

Il y a un seul Setup pour toutes les versions et le téléchargement se passe ici : https://msdn.microsoft.com/en-us/subscriptions/securedownloads/details/default.aspx?pm=pid%3a334%7CLk:t

Je suis en pleine installation, en mode side-by-side. Je ferai des retours réguliers sur cette version quasi-finale.

jeudi 24 avril 2008

De l'utilisation de NOLOCK

J'ai eu il y a quelques temps la question suivante :

j'aimerais faire comprendre à mes développeurs l'intéret de positionner des NOLOCK dans les requêtes de sélection, peux-tu m'aider pour faire l'argumentaire

Pour rappel ou pour ceux qui ne voient pas de quoi je parle, NOLOCK est un Query Hint qui permet de passer le mode d'isolation au niveau le plus bas sur la lecture d'une table. Il s'utilise de la façon suivante :

Select * From MaTable WITH (NOLOCK)

Voici la réponse que j'ai donné :

Premièrement et c'est le plus important, utiliser NOLOCK n'est pas « naturel », dans le sens où la base de donnnées est là pour garantir les accès concurrents et gérer des lecture/écriture dans une optique transactionnelle (contraintes ACID1) et ceux même pour un énorme volume de transactions.

Cependant, sans aller jusqu'à dire que c'est un constat d'échec que de l'utiliser, le hint NOLOCK est intéressant dans certains contextes.
Notamment les sites Web qui font beaucoup d'accès en lecture pour faire principalement de l'affichage. Dans ce cas, en effet, avoir une donnée non commitée n'est (en général) pas critique, sauf pour certains sites (bourses, état de stock, etc.). Cela permet de soulager la base de données et de booster l'affichage des pages.

Mais pour moi, le NOLOCK n'est qu'une réponse technique d'urgence et ne sert juste qu'à cacher la poussière sous le tapis. Il faut comprendre pourquoi l'ajout d'une ligne dans une facture bloque l'affichage du top 10 des vendeurs et essayer d'y répondre par la conception de l'application (cache, portée des transactions, etc.) ou de la base (normalisation/dénormalisation).
J'insiste qu'il y a un risque à utiliser NOLOCK à tout va, car on peut récupérer des données "dirty" et les réécrire par la suite et perdre la cohérence (aCid); à l'application d'adresser cette contrainte.

Donc pour conclure :

  • le NOLOCK est une réponse technique intéressante pour optimiser l'affichage de données NON CRITIQUES
  • l'utilisation systématique du NOLOCK n'est pas une bonne chose car elle cache un réel problème transactionnel. Et surtout on ne respecte plus la "norme" ACID.

Si tu utilises SQL Server 2005, il faut te tourner vers les autres niveaux de verrou comme le Snapshot (READ_COMMITTED_SNAPSHOT) qui apporte la souplesse en lecture tout en garantissant les transactions (comme le fait Oracle). Un bon argument pour passer à 2005.

1ACID: Atomicité, Cohérence, Isolation, Durabilité

lundi 7 avril 2008

Problèmes de CTP

J'ai eu, et cela m'est aussi remonté par mes collègues et relations, des soucis avec les installations des CTP de SQL Server. Obligation d'installer deux fois, erreur à la désinstallation...

Un des problèmes que j'avais est le suivant : après une installation réussie, seul un point, et non des moindres, ne marchait pas, le requêtage depuis Management Studio. A l'exécution d'une requête SELECT, Management Studio mouline et ne retourne jamais les résultats. Pourtant, il est possible d'afficher ou de créer des tables ou des bases de données.

J'ai le moyen de contournement à ce problème qui est référencé auprès de Microsoft (programme Connect) : il faut laisser TOUS les répertoires par défaut à l'installation (ie. C:\Program Files\Microsoft SQL Server\). Pour moi, une désinstallation-réinstallation ont suffi pour régler le problème.

Le lien du "bug" est le suivant : http://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=312344

PS : par contre, j'ai dû mettre les droits au service qui fait tourner SQL sur le répertoire où sont mes fichiers MDF à la main... Ah ces sacrés CTP.

 

vendredi 28 mars 2008

Reporting Services SP2 sur Windows SP1: Erreur 401

Un post pour relayer un problème (et sa résolution) que j'ai rencontré chez un client récemment.

Pour résoudre quelques bugs que nous avions sur Reporting Services (rsInternalError sur un drill-through, mauvais raffraichissement des données et de la Document Map au changement de paramètres), je décide [enfin] de passer le Service Pack 2 de SQL Server 2005 sur la production.

Après l'installation, tout semble fonctionner correctement sauf une application qui attaque le Web Service de Reporting Services (reportservice2005.asmx). Chaque appelle se solde par une erreur d'authentification (HTTP 401). A noter que le site web qui attaque le Web Service est sur la même machine.

C'est là que je m'aperçois que le serveur est loin d'être mis à jour régulièrement puisque Windows est encore en Service Pack 1. Bien convaincu, d'après différentes discussions dans les newsgroups, que le problème vient du système obsolescent, j'allais planifier une coupure pour la mise à jour quand mon collègue Nicolas a trouvé LE patch de derrière les fagots :

dans la base de registre, ajouter la clé DisableLoopbackCheck (DWORD) avec une valeur de 1 dans HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa

Bon, cela ne me dispense pas de passer les patchs sur Windows mais ça nous a permis de corriger rapidement (merci Nico).

Voici la KB correspondante :
http://support.microsoft.com/default.aspx/kb/896861/en-us

jeudi 27 mars 2008

De l'instruction COALESCE

Ce petit post pour faire découvrir ou, je l'espère,  redécouvrir, une instruction T-SQL : COALESCE. La définition de cette instruction est :

retourne la première valeur non nulle.

Quand je parle de cette instruction que j'utilise depuis 2001, on me dit toujours : ben t'as qu'à utiliser ISNULL... Ce n'est pas faux car ISNULL fait la même chose mais uniquement entre 2 valeurs.

Récemment, je suis tombé sur ce code T-SQL, assez illisible : 

ISNULL(matable.Col1, ISNULL(maTable.col2, ISNULL(DefTable.Col1, @ValeurParDefaut))

En "correction", j'ai proposé :

COALESCE(matable.Col1, maTable.col2, DefTable.Col1, @ValeurParDefaut)

Voila, ça fait la même chose mais c'est plus propre et plus simple à maintenir.

mardi 25 mars 2008

TechDays 2008 - Les sessions en Webcast

Comme l'an passé, vous pouvez revivre l'expérience des TechDays via les Webcasts des sessions. A ma connaissance, toutes les sessions (environ 300) ont été webcastées. Ca va en faire des heures devant l'écran...

J'en profite pour faire de la promo pour ma session, co-animé avec Sébastien Pertus, sur les nouveautés en termes de stockage avec FileStream et Remote BLOB, les nouveautés de la recherche Full-Text et les nouveautés XML dans SQL Server 2008. Vous pouvez la visionnez à l'adresse suivante :

http://www.microsoft.com/france/vision/mstechdays08/WebcastTechNet.aspx?EID=fb17a388-7d57-4339-bd35-d357e7090600

On bafouille un peu les 5 premières minutes mais une fois dans la technique... bref, on va dire que c'est parceque ce sont les premiers TechDays ;-)

Un autre lien utile, l'accès direct aux Webcasts du parcours SQL Server 2008 : http://www.microsoft.com/france/vision/mstechdays08/Parcours.aspx?Oid=64379656-8b55-4158-a660-f840e29290c9

Et puis, rappelons le, si vous préférez échanger en direct avec des spécialistes, l'équipe DGD, quelques experts Microsoft et les consultants Bewise vous attendent tous à la Bewise Developer Conference à Toulouse le 10 avril.

UPDATE : j'oubliais, les sources de nos démos sont ICI

dimanche 9 mars 2008

Ne faites pas confiance au designer de requête

Chez presque tous mes clients, tout le monde utilise le Query Designer pour écrire un SELECT en T-SQL, que ce soit pour faire une vue, une simple recherche ou encore pour créer un Dataset dans Reporting Services. Nombre de mes collègues utilise cet outil également.

A chaque fois je fais la même remarque qui me fait passer pour un vieux con has been :

Evitez d'utiliser le designer de requête ou bien refaite une passe sur le T-SQL généré.

Mes arguments étant les suivants : ordre des jointures, lisibilité du code généré et une expérience avec la bête ayant développée ma mauvaise impression à son égard.

Mais depuis SQL Server 2005, j'ai dû souvent avaler mon chapeau car la qualité de l'optimiseur de requêtes faisait passer mon argumentaire pour un discours de bonimenteur.

Mais j'ai enfin trouvé un cas reproductible où le designer de requête ne ramène pas le résultat escompté et où l'optimiseur de requêtes ne peut pas corriger le tir. En plus, pour appuyer mon discours, je tiens à préciser que cette imprécision du designer a conduit à des erreurs dans des rapports de synthèse.

Explication de texte :

Nous allons travailler avec AdventureWorks. Mon besoin est le suivant : je veux récupérer les produits bleus et, si j'ai l'info, afficher leur prix en juillet 2002. Il y a 26 produits bleus dans la table Product.

 Voici la requête fournie par l'éditeur de requête :

SELECT Production.Product.ProductNumber, Production.Product.Name, Production.ProductCostHistory.StandardCost AS Cost200112
FROM Production.Product LEFT OUTER JOIN
Production.ProductCostHistory ON Production.Product.ProductID = Production.ProductCostHistory.ProductI
WHERE (Production.ProductCostHistory.StartDate = CONVERT(DATETIME, '2002-07-01 00:00:00', 102)) AND
(Production.Product.Color = N'Blue')

Et en résultat, je n'ai qu'un seul produit bleu au lieu de 26. Le problème est que le designer ajoute la condition de la date à l'ensemble du jeu de résultat, or s'il n'y a pas de prix disponible à la date demandée, la valeur sera NULL à cause de la jointure externe.

Pour corriger le problème, il faut remonter la condition sur la jointure pour filter la table ProductCostHistory avant de faire la jointure.

ON Production.Product.ProductID = Production.ProductCostHistory.ProductID AND
(Production.ProductCostHistory.StartDate = CONVERT(DATETIME, '2002-07-01 00:00:00', 102))

 Ainsi, le LEFT JOIN est correctement interprété à l'exécution et on obtient bien les 26 produits bleus. On utilisait cette  technique pour optimiser sous SQL Server 2000 car il arrivait que l'optimiseur ordonne mal les opérations dans le plan d'exécution.

Si on réouvre la requête avec l'éditeur, il représente bien la condition mais de façon assez... bizarre. D'ailleurs, je ne saurais même pas le refaire à la souris. 

Aussi, le designer écrit les tables de la clause FROM dans l'ordre où vous posez les tables sur la surface de travail, ce qui lui fait mettre un RIGHT JOIN au lieu d'une lecture plus naturelle avec un LEFT JOIN. Ceci entraîne une maintenance plus complexe, déjà que se plonger dans une grosse requête n'est pas forcément trivial...

Autre problème que j'ai rencontré quelques fois, quand il y a trop de jointures, LEFT, RIGHT et INNER, en essayant de les mettre bout à bout il arrive qu'il se rate sur le résultat global (bien souvent avec des données non remontées) :-(.

En conclusion, même si le designer vous fait gagner du temps de rédaction, pensez à vérifier les jointures (ordre, condition) et en particulier les jointures externes.

jeudi 6 mars 2008

Connection String et Application Name

Je voudrais passer un message à tous les développeurs. Dans tous vos développements, lorsque vous avez des chaînes de connexion...

utilisez la propriété "application name" !!

 

En effet, quand on profile une base de données pour auditer les performances ou pour recenser les utilisateurs en vue d'un migration par exemple, cette information est importante pour voir plus facilement qui fait quoi. Sinon, vous verrez apparaître dans vos traces l'application .NET SqlClient Data Provider qui est tout simplement la valeur par défaut de ADO.NET.

Pour pallier à cela, voilà à quoi doit ressembler votre chaîne de connexion :

Data Source=SERVER;Initial Catalog=DATABASE;Integrated Security=SSPI;Application Name=www.bewise.fr

Merci d'avance pour les gens qui travaillent sur la BD.

mercredi 5 mars 2008

SSDS : SQL Server Data Services

Ce soir, il y a eu une annonce au MIX'08 de Las Vegas d'un nouveau produit dans la famille SQL Server :

SQL Server Data Services

Kezako. C'est une base de données en ligne, un SQL Server en mode ASP. Cela permet de démarrer une activité et de disposer d'une base de données rapidement sans avoir à trouver une hébergeur, installer un serveur, etc. On paie à l'usage.

La techno semble séduisante et mystérieuse. Au programme : un requêtage en LINQ, de la recherche Full-Text, une communication via SOAP, un stockage illimité (moyennant des $$) et un SLA sur de la haute-disponibilité...

Une chose m'intrigue, dans la page de présentation du produit on peut lire :

Years of experience running these technologies in-house.

C'est qu'ils savent bien garder un secret chez MS. Et dire que moi je critiquais l'ouverture de Endpoint HTTP dans un serveur de données, peut-être était-ce ceci la finalité. Ca me fait penser à ce bon article de Bob Beauchemin sur les synergies de développement chez MS.

Toutes les infos et pour s'enregistrer dans le programme beta :
http://www.microsoft.com/sql/dataservices/default.mspx

Je vous laisse, je vais revendre mes serveurs sur eBay.

- page 3 de 6 -