février 2008 - Messages
Aujourd'hui, une nouveauté de la dernière CTP (6) de Sql Server 2008:
La possibilité de créer des index filtrés.
Alors "késako" des index filtrés ?? Eh bien c'est tout simplement, la possibilité de dire à un index de n'indexer qu'une partie de ses données !
Un exemple (enfin deux) valant souvent plus qu'une longue explication :
Première Exemple :
Supposons qu'une table de Client comporte un champ fixe de 5 charactères (Char(5)) contenant le code postal de la ville où il réside.
Supposons encore que l'entreprise qui utilise votre logiciel ne désire travailler que sur les clients dans le code postal est compris entre 30000 et 33000 (pourquoi pas !), bien que la base de données contiennent un ensemble de clients de la france entière :
Eh bien vous pouvez tout simplement créer un index filtré sur la colonne CodePostal, en indiquant que seul les code postaux entre les bornes 30000 et 33000 seront indexés !
La preuve en exemple et en image. Remarquez au passage le lifting de l'interface de création d'un index :
Etape 1 : Je crée mon Index :
Etape 2 : Je donne un critère de filtre à mon Index (entre 30000 et 33000)
Et voilà c'est fini :)
Comment vérifier que mon index fonctionne ? En essayant d'interroger mon index via une requète qui le fait intervenir.
Un truc du genre (simplissime)
Select * from Client Where CodePostal = '31100'
Voilà ce que donne le plan d'exécution :
On voit bien que notre nouvel index est directement attaqué (Seek)
Il est effectué un Key Lookup sur notre index pour récupérer l'ensemble des colonnes.
(Tiens, au passage : Question subsidiaire : Comment éviter le Key Lookup en minimisant l'impact sur votre base de données ? Réponse dans 1 ou 2 jours si j'ai des tentatives de réponses :))
On continue notre test en modifiant le critère du codepostal en le passant "hors index filtré" :
Un truc du genre (toujours aussi simplissime)
Select * from Client Where CodePostal = '21100'
Le résultat en image :

On voit bien que notre index n'est pas utilisé et que le moteur SQL a scaner l'index cluster (oh mon dieu .. :))
Deuxième exemple :
Un intéret majeur découle de l'utilisation de ce genre d'index filtré : La possibilité de définir l'unicité d'une colonne MAIS en autorisant AUSSI la colonne a être nulle :)
Supposons ma table de client comporte un numéro de sécurité sociale. Il est impératif que ce numéro de sécurité sociale soit unique, si et seulement si il est connu de l'entreprise.
Avant, les solutions existaient mais pouvaient paraître compliquées (Merci Jean Pierre ;))
Aujourd'hui, facile !
Créeons un index filtré. pour la forme, cette fois ci, je passe par du code T-SQL pour créer mon index filtré :
--------------------------------------------------------------------------------------
USE [Demo]
GO
CREATE UNIQUE NONCLUSTERED INDEX [IX_NumSecuSociale] ON [dbo].[Client]
(
[NumSecuriteSociale] ASC
)
WHERE NumSecuriteSociale is not null
GO
--------------------------------------------------------------------------------------
Et c'est fini (oui je sais .. je sais ...)
Il ne reste plus qu'à tester tout ça :
--------------------------------------------------------------------------------------
INSERT INTO [Demo].[dbo].[Client]
([ClientId] ,[EmployeId] ,[ClientTypeId] ,[Prenom] ,[Nom]
,[Adresse] ,[Ville] ,[CodePostal] ,[NumSecuriteSociale])
VALUES
(NewId() ,Null ,1 ,'Sébastien' ,'Pertus' ,'4 av M' ,'TOULOUSE' ,'31100'
,'1234567890')
--------------------------------------------------------------------------------------
Et une deuxième fois avec un numéro de sécurité sociale identique
--------------------------------------------------------------------------------------
INSERT INTO [Demo].[dbo].[Client]
([ClientId] ,[EmployeId] ,[ClientTypeId] ,[Prenom] ,[Nom]
,[Adresse] ,[Ville] ,[CodePostal] ,[NumSecuriteSociale])
VALUES
(NewId() ,Null ,1 ,'Jean' ,'Durand' ,'Bvd Carnot' ,'TOULOUSE' ,'31100'
,
'1234567890')
-------------------------------------------------------------------------------------- Le résultat en image :
Insertion de la première ligne et refus d'insertion de la deuxième.
Par contre, je peux tjs insérer des clients sans numéros de sécurité sociale, et autant que j'en veux :)
--------------------------------------------------------------------------------------
INSERT INTO [Demo].[dbo].[Client]
([ClientId] ,[EmployeId] ,[ClientTypeId] ,[Prenom] ,[Nom]
,[Adresse] ,[Ville] ,[CodePostal] ,[NumSecuriteSociale])
VALUES
(NewId() ,Null ,1 ,'Inconnu' ,'du Bataillon' ,'P. Jeanne d'arc' ,'TOULOUSE' ,'31100'
,Null)
--------------------------------------------------------------------------------------
Une bien belle fonctionnalité que ces index filtrés !
Happy Indexing !
News reprise du Blog de Pascal Belaud
La nouvelle CTP de SQL Server 2008 ( en CTP 6 ) est disponible !
Et, oh Joie, petite surprise à l'installation qui fait sourire :)
Sync Framework Install
Bon Téléchargement à tous :)
http://www.microsoft.com/sql/2008/prodinfo/download.mspx
Visual Studio 2008, c'est juste une tuerie en terme de fonctionnalités.
En gros, vraiment, il dépote...
MAIS en design d'une page aspx (un peu grosse) ... IL EST LENT !!! Enfin, lent ... c'est pas le mot exact, je devrais dire INSUPPORTABLEMENT LENT ....
C'est une catastrophe, l'écran se fige quelques secondes avant de vous donner la main; et ce à chaque semblant de déplacement du curseur.
Une horreur....
Et bien heuresement pour vous, le patch corrigeant ce soucis (qui sera inclus dans le SP1 un de ces quatres matins) est arrivé !
Voir le post de Scott Guthrie himself sur le sujet : Hotfix View Performance
Attention, le patch ne fait que 3 mégas, mais il met bien 10 minutes à s'installer ...
[Edit] Je viens de l'installer, et y'a pas à dire, ça vous change la vie !
Oui alors évidemment, quand on a passé plusieurs semaines à trimer et ramer pour préparer ses sessions, forcément le lendemain des TechDays, on cherche fébrilement les réactions des visiteurs 
Pour faire même complet, on cherche même les réactions des visiteurs à ses propres sessions (bah biensur hein
)
Eh ben moi j'en ai trouvé .. une !
http://www.davidverriere.net/2008/02/techdays-2008-jour-2.html
Alors, merci monsieur David d'être, d'abord venu voir ma session et en plus de l'avoir appréciée !
Et merci aussi pour la photo ! Allez je la chippe au passage, j'ai pas pu m'auto-prendre en photo moi même 

Si jeune et déjà star ... non ?... non ! Comment ça .. non !!!
Pascal Belaud vient de publier un projet surlequel il travaillait depuis quelque temps déjà :
Sql Server 2D matrix Builder
Imaginez pouvoir croiser des données d'une base de données relationnelles en une simple requête managée !
Imaginez pouvoir recouper des données en lignes sur des colonnes, en prenant en compte des tables de type n-n
J'ai eu la chance d'avoir eu, en avant première l'outil entre les doigts, et je peux vous dire que non seulement c'est trés classe mais en plus trés simple à utiliser !
Je vous conseille donc à tous de lire l'article complet, en français, que Pascal nous offre pour expliquer le fonctionnement de cette assembly ambarquée dans SQL SERVER 2005.
Et pour les curieux du code, vous trouverez aussi le projet sur CodePlex : http://www.codeplex.com/SQL2DMatrixBuilder
Happy coding !
Et voilà c'est fini 
Bon ben ma dernière session sur FileStream, accompagné de mon collègue Jean Pierre, s'est bien passée.
Bon on voit que c'était le dernier jour et il y avait vraiment beaucoup moins de monde que les 2 premiers jours ...
Nous n'avons pas fais salle comble, mais la salle était assez grande quand même :)
Bon on a tout dit, mais par manque de temps, on a pas pu enquiller la dernière démo sur les nouveautés XML apportées par SQL Server 2008. Dommage, mais bon, ça va ça va vient !!!
Enfin bref, voilou on rentre à Toulouse... Enfin pour l'instant on est coincé à l'aéroport à cause des grèves et on est quand même content d'avoir le wifi hors de prix de l'aéroport.
Bon c'est clair, ce wifi il poutre sévère, pas de lag, je pourrais presque me connecter à Wow !! En même temps, au prix que c'est, je comprends que le réseau soit pas saturé !!
Allez, on prend ça avec philosophie (pour l'instant ) et on attend tranquillou que ça veuille bien décoller !
Je fais un billet vite fait, pour répondre à une question qu'on m'a posée et à laquelle je n'ai pas tout à fait répondu
La question était : Comment créer un DataContext qui pointe sur SQL SERVER 2008.
Il faut dire que, pour le moment, le designer n'est pas capable de créer votre fichier dbml pour générer le code correspondant à une table SQL SERVER 2008.
Ce qu'il faut savoir c'est que Visual Studio utilise en fait un utilitaire en ligne de commandes, appellé SqlMetal.
Il suffit donc de lancer cet utilitaire "à la main" pour créer vos classes correspondant à vos tables stockées sur SQL SERVER 2008.
Un petit exemple pour la route :
sqlmetal /Server:.\sql2008 /database:Demo /Code:DemoClass.cs
Une petite ressource, au hasard d'internet :
http://www.simple-talk.com/dotnet/.net-tools/exploring-linq,-sqlmetal-and-sqltac/
Bah voilà j'espère avoir répondu à la question posée
Allez je retourne réviser mes slides !
Si comme moi vous avez installé la dernière CTP (5) de SQL Serveur 2008 en parrallèle d'une instance SQL Serveur 2005, il se peut que vous vous retrouviez avec une vieille erreur qui colle quand vous tentez d'ouvrir une table en Design.
Du genre :
The located assembly's manifest definition does not match the assembly reference (Exception From HRESULT : 0x80131040) (Microsoft.SqlServer.SqlTools.VSIntegration)
Oui ça fait tout bizarre...
Pour la petite histoire ça m'est arrivé en plein milieu de ma session Sur Sync Services... Bon c'est juste qu'il faut pas stresser quand ça te tombe dessus :) Je vous laisse découvrir, quand les web casts seront dispo, comment je m'en suis sorti ;)
Sinon, j'ai fais quelques recherches et d'abord première nouvelle (bonne) l'équipe SQL SERVEUR est au courant et ce bug sera résolu dans la prochaine CTP.
Et la deuxième bonne nouvelle c'est qu'il existe une solution trés trés simple pour résoudre ce petit Bug, en ligne de commande.
Pour SQL SERVEUR 2005 : Tout d'abord, se placer dans la répertoire où se trouve l'exe du SQL SERVER MANAGEMENT (sqlwb.exe) et lancer la ligne de commande :
sqlweb.exe /setup /selfreg
Pour SQL SERVEUR 2008 : Même principe, on se place dans le répertoire de l'exe du SQL SERVER MANAGEMENT (ssms.exe cette fois ci) et lancer la ligne de commande :
ssms.exe /setup /selfreg
Un ptit screen du symptome et de la solution :
Happy SQL Design !
Ca y'est, ma Session sur Sync. Services est terminée.
Ouf !!
Tout s'est bien passé, aucun problème particulier, les démos se sont toutes bien passées, le public était là et enthousiaste, de ce que j'ai pu en resentir sur l'instant
Bon juste un bug sur ma CTP de SQL Serveur 2008, qui m'a fait planté le designer en plein vol ! Bon rien d'irratrapable, mais un petit coup de stress (de plus) en live
Voilà, espérons que ma sessions sur FileStream demain se passe aussi bien !!
J'y retourne !