Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

SQL Server : Gestion des minuscules, majuscules et accent dans les chaînes de caractères

A la question : Est-ce que SQL Server traite les chaînes de caractères en ignorant la différence majuscule / minuscule ou pas, que répondriez vous ?

La réponse est très légèrement normande, car cela dépend. De quoi ? Du classement (collation / collate) des chaînes de caractères comparées.

Le classement sert à définir plusieurs éléments :

  • Le jeu de caractère utilisé par les champs non unicode (varchar, char et text)
  • La manière de trier les chaînes de caractères
  • Certaines options de comparaison telles que la sensibilité à la casse, aux accents, à la largeur du caractère, etc.

La casse est justement le sujet qui nous intéresse en termes de différentiation des minuscules et majuscules. Le critère permettant de savoir si notre comparaison est sensible ou non aux minuscules et majuscules est bien le classement.

Prenons le classement par défaut de SQL Server sur une machine installée en Français : French_CI_AS. CI signifie CASE INSENTIVE, le moteur est donc par défaut insensible aux différences entre les minuscules et les majuscules dans les comparaisons des chaînes de caractères, que ce soit avec un « = » ou un « LIKE ». Ainsi les 2 requêtes suivantes devraient renvoyer le même résultat (en fonction des paramètres de votre serveur ou de vos bases de données) :

use AdventureWorks
go

select * from Production.Product
where Color = 'Black'

select * from Production.Product
where Color = 'BLACK'

Or il est possible de changer le classement de la chaîne de caractère, ce qui permet d'influencer la comparaison. Les 2 requêtes suivantes permettront de forcer la différenciation entre les minuscules et majuscules. De ce fait elles reverront des résultats différents :

use AdventureWorks
go

select * from Production.Product
where Color = 'Black' collate French_CS_AS

select * from Production.Product
where Color = 'BLACK' collate French_CS_AS

En ce qui concerne les accents, le comportement est identique, le changement du classement entre AS et CS permettra de prendre en compte ou non l'égalité de ceux-ci avec des caractères non accentués. Par défaut toujours les serveurs sont configurés comme étant sensibles aux accents , les requêtes suivantes renverront des résultats différents :

use AdventureWorks
go

select * from Production.Product
where Color = 'Blâck'

select * from Production.Product
where Color = 'Black'

Le fait de rendre insensible le classement aux accents permettra d'avoir un résultat cette fois identique :

use AdventureWorks
go

select * from Production.Product
where Color = 'Blâck' COLLATE French_CI_AI

select * from Production.Product
where Color = 'Black' COLLATE French_CI_AI

La commande COLLATE est très intéressante quand elle est bien maitrisé pour changer le comportement des comparaisons et prenant en compte les différences de certains caractères. Il faudra tout même faire attention à la présence éventuelle d'un index qui ne sera utilisé en cas d'utilisation d'un classement différend de celui de base de la colonne texte.

J'avais déjà fait un petit exemple de code ici :
http://www.sqlfr.com/codes/SQL-SERVER-COMPARER-CHAINES-CARACTERES-AVEC-SANS-ACCENTS_39041.aspx

Bonne comparaison…

Posté le par christian | 2 commentaire(s)
Classé sous : ,

Données : Les formes normales en poster pour ne plus les oublier

Les formes normales, qui n'a pas eu à plancher là-dessus à l'école ou par la suite… Je vous défis de vous en souvenir par cœur et les lister toutes à l'écrit. Pour éviter de sécher sur le sujet voici un grand poster regroupant les 5 premières formes avec des exemples animaliers :

http://www.marcrettig.com/poster/rettigNormalizationPoster.pdf

En anglais certes, mais assez pratique pour s'en souvenir.

Bonne modélisation…

Posté le par christian | 0 commentaire(s)
Classé sous :

SQL Server : Encore d’autres publications de spécifications de la part de Microsoft

Comme indiqué un peu plus tôt par Neodante (http://blogs.codes-sources.com/neodante/archive/2008/06/30/la-documentation-technique-des-protocoles-microsoft-est-tamponn-e-1-0.aspx) Microsoft vient de fournir des spécifications supplémentaires

Sur SQL Server quelques une sont intéressantes, tels que les spécifications des chaînes de connexion en ODBC et en OLEDB :

ODBC : http://msdn.microsoft.com/en-us/library/cc678149.aspx

OLEDB : http://msdn.microsoft.com/en-us/library/cc678147.aspx

Les protocoles de communication de SQL Server :

TDS (pour le moteur relationnel, déjà publié) : http://msdn.microsoft.com/en-us/library/cc448435.aspx

Protocole pour Analysis Services 8 (2000) : http://msdn.microsoft.com/en-us/library/cc676956.aspx

Protocole pour Analysis Services 9 (2005 et +) : http://msdn.microsoft.com/en-us/library/cc676956.aspx

Et le format de sérialisation binaire de l'XML dans les communications : http://msdn.microsoft.com/en-us/library/cc580569.aspx

Pour ma part les spécifications des chaînes OLDB et ODBC me semble rudement intéressantes, depuis le temps que je cherchais ce type d'infos.

Bonne lecture…

Posté le par christian | 0 commentaire(s)
Classé sous :

SQL Server : Tous les types de données en un coup d’œil !

C'est une remise à jour d'un précédent tableau que j'avais publié sur le blog : http://blogs.codes-sources.com/christian/pages/sql-server-data-types.aspx

Remis à jour avec les types SQL Server 2008 et un peu dépoussiéré… Comme le copier / coller de XLS vers une page HTML ne conserve pas très bien le format je vous le propose en PDF en pièce jointe de ce post comme çà vous aurez tout loisir de pouvoir l'imprimer sans pertes.

 

Bonne lecture…

Microsoft : Nouvelle certification Microsoft Certified Master (MCM)

Dans la série des changements dans les certifications, il y a eu les changements de MCDBA, MCSE et autres vers les MCTS et MCITP et MCPD, s'est ensuite ajouté la série des Architectes (MCA : http://blogs.codes-sources.com/christian/archive/2007/05/14/sql-server-microsoft-certified-architect-database-mca.aspx ).

Maintenant Microsoft a décidé d'ajouter le niveau « Master » à cette suite de certifications techniques. En pratique elle ne s'intercale pas tout à fait entre la certification Architecte et les autres, mais plutôt à côté. En effet la certification « Master » a pour objectif d'être plus technique que la certification Architecte. Cela se traduit aussi par un coût moindre 18500$ et un nombre de semaines de formation obligatoire réduit 3 au lieu de 4 semaines.

Elle sera disponible dans un premier temps sur :

  • Exchange 2007
  • SQL Server 2008
  • Windows Server 2008

Puis

  • SharePoint 2007
  • Office Communication Server 2007

Les développeurs devraient avoir accès à une certification de ce type plus tard !

Pour plus de détails et les pré-requis :
http://www.microsoft.com/learning/mcp/master/default.mspx

Prenons SQL Server 2008, le pré requis est assez simple : toutes les certifications SQL Server 2005 et plus de 5 ans d'expérience sur SQL Server.

Le responsable de ce groupe de certifications livre plus de détails sur cette certification ici :
http://blogs.msdn.com/trika/archive/2008/06/26/more-on-the-certified-master-programs-from-me-per-the-program-owner.aspx

Bonne certification…

Posté le par christian | 6 commentaire(s)
Classé sous : ,

Hyper-V : Version finale disponible

C'est maintenant officiel et annoncé sur les blogs des équipes de développement, Hyoer-V est disponible en version finale. Cet outil permettant la virtualisation serveur haute performance à l'instar de son principal concurrent VMWare ESX server.

L'annonce ici (en anglais) :
http://blogs.technet.com/jhoward/archive/2008/06/26/hyper-v-rtm-announcement-available-today-from-the-microsoft-download-centre.aspx

Le téléchargement se fait là (l'article su support correspondant : http://support.microsoft.com/kb/950050/en-us ):
http://www.microsoft.com/downloads/details.aspx?FamilyId=F3AB3D4B-63C8-4424-A738-BADED34D24ED&displaylang=en
et
http://www.microsoft.com/downloads/details.aspx?FamilyId=F3AB3D4B-63C8-4424-A738-BADED34D24ED&displaylang=fr

L'article du support technique détaillant toutes les versions de système d'exploitation supportés :
http://support.microsoft.com/kb/954958/en-us

En l'occurrence les Windows suivant : Vista, 2008, XP, 2003, 2000 et Linux Suse 10

Et enfin le site officiel US :
http://www.microsoft.com/windowsserver2008/en/us/virtualization-consolidation.aspx

Il vous faut un Windows Server 2008 en 64 bits (x64) pour l'installer…

Bon téléchargement…

Posté le par christian | 0 commentaire(s)

SQL Server : Réservez son Velib’ avec SQL Server…

Vous ne le saviez sans doute pas, mais le système de gestion des Velib' fonctionne grâce à SQL Server 2005.

Pour découvrir le cas de JC Decaux avec ses Velib' et bien d'autres rendez vous ici :

« Ils l’ont fait avec SQL Server. Découvrez comment ! »

La page est en SilverLight, si vous ne l'avez pas installé ou que vous souhaitez voir directement le cas JC Decaux c'est par ici que çà se passe :

http://www.microsoft.com/France/Temoignages/Fiche-Temoignage-avec-webcast.aspx?EID=f62535c7-ad96-4f4a-9af6-eb3b9adfbd8c

Bonne location…

Posté le par christian | 0 commentaire(s)
Classé sous :

SQL Server 2005 : Correctif cumulatif n 8 pour SQL Server 2005 Service Pack 2 (Hotfix - Build 3257)

Il est tout chaud le dernier correctif en date pour SQL Server 2005 équipé du Service Pack 2. Toujours au rythme d'une sortie tous les 2 mois avec l'ensemble des corrections de bug apportées depuis le dernier Service Pack.

C'est donc le correctif connu sous le numéro de Build 3257 que vous trouverez à l'emplacement suivant :
http://support.microsoft.com/kb/951217/en-us

Ou en traduction automatique en Français :
http://support.microsoft.com/kb/951217/fr

Le correctif ne semble pour le moment pas disponible en téléchargement ni direct, ni via un formulaire de demande, il faudra passer par le support technique pour l'obtenir.

Bon correctif…

Moteurs de base de données : Enfin un papier objectif sur les comparaisons entre SQL Server et Oracle

En errant sur le Net j'ai la main sur un document rédigé par une société spécialiste des bases de données. D'après ce que j'ai lu jusqu'à présent, le comparatif est objectif et ne cherche pas à pinailler sur des détails d'implémentation telle que les tailles des types, etc.

Vous pourrez jetez un coup d'œil ici :
http://www.opssys.com/InstantKB/attachments/mssql2005_oracle10g_compare-GUID57335f0629244855b27731885f987a91.pdf

Lecture intéressante, qui m'en a appris beaucoup sur les dernières fonctionnalités d'Oracle. Seul regret çà ne concerne que la version 10 d'Oracle et la version 2005 de SQL Server. Espérons qu'ils reproduiront le même document à jour pour les nouvelles versions des 2 moteurs.

Pour ce qui des comparaison des versions 11 de Oracle et 2008 de SQL Server, Microsoft a édité un papier sur le sujet que vous retrouverez ici :
http://www.microsoft.com/sqlserver/2008/en/us/sql2008-oracle11g.aspx

Bonne lecture…

SQL Server 2008 : Le débuggeur est arrivé dans Management Studio

Toujours dans la série des fonctionnalités qui avait disparues entre SQL Server 2000 et SQL Server 2005, le débuggeur vient de refaire son apparition dans Management Studio sous SQL Server 2008.

Vous verrez apparaitre à côté du bouton « Execute » une flèche verte permettant de lancer le débuggeur

Qui permettra l'exécution en pas à pas du code Transact-SQL. Très bonne nouvelle dans la mesure où le seul outil pour faire cela dans SQL Server 2005 était Visual Studio.

Tout y est : toutes les options de pas à pas, la liste des variables locales et la pile d'appel…

Un petite critique, je me fais avoir 9 fois sur 10 en cliquant sur le bouton de débogage au lieu de celui d'exécution…
Ce que je fais, c'est que je me débarrasse de ce bouton, et conserve au besoin la barre d'outils de débogage visible.

Bon debug…

Posté le par christian | 2 commentaire(s)

SQL Server / SQL Server 2008 : Promotion de verrou / Lock Escalation - statistiques sur les blocages

La promotion de verrou est phénomène qui se produit couramment dans le moteur. Le but de celui-ci est d'économiser des ressources aussi bien mémoire que processeur.

En pratique dès que le moteur verrouille plus de 5 000 enregistrements il va chercher à verrouiller au niveau supérieur, c'est-à-dire au niveau page, au-delà de 5 000 pages on verrouillera la table. Le contrôle de la promotion se fait tous les 1250 verrous. Il est possible que la promotion échoue par ailleurs et que la finesse de verrouillage reste à son niveau initial.

En tout cas c'est le principe documenté, et il y a des fois où il n'est pas franchement évident de comparer pratique et cette description théorique qui peuvent ne pas correspondre… Eh oui la gestion des verrous reste compliquée !

Voici un petit script pour reproduire le phénomène :

use AdventureWorks
go

-- Démarre une transaction en mode de REPEATABLE READ
-- Pour conserver les verrous après le SELECT
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ

BEGIN
TRANSACTION

-- Etats des stats sur les verrous
select row_lock_count, row_lock_wait_count, row_lock_wait_in_ms,
     page_lock_count, page_lock_wait_count, page_lock_wait_in_ms,
     index_lock_promotion_attempt_count, index_lock_promotion_count
from sys.dm_db_index_operational_stats(DB_ID(), object_id('Person.Address'), null, null)

select * from Person.Address

-- Liste les verrous de la session en cours
select * from sys.dm_tran_locks where request_session_id = @@SPID

-- Etats des stats sur les verrous
select row_lock_count, row_lock_wait_count, row_lock_wait_in_ms,
     page_lock_count, page_lock_wait_count, page_lock_wait_in_ms,
     index_lock_promotion_attempt_count, index_lock_promotion_count
from sys.dm_db_index_operational_stats(DB_ID(), object_id('Person.Address'), null, null)

ROLLBACK TRAN – ou COMMIT, on ne fait que des lectures, donc peut importe

Idéalement, lancez SQL Profiler avant, et suivez l'événement « Lock :Escalation » situé dans « Locks ». Et si vous avez du courage « Lock :Acquired » et « Lock : Released », non pas que çà soit compliqué, le nombre d'évènement de type acquisition de verrous et libération sont très nombreux, le résultat sur des grosses tables s'appelle chercher une aiguille dans une botte de foin.

Que constates t'on ? SQL Server commence à verrouiller au niveau enregistrement (çà on le sait par la fonction dm_db_index_operational_stats car le champ row_lock_count augmente après l'exécution de la requête) et va rapidement verrouiller la table (çà on le sait par dm_tran_locks qui nous indique la présence d'un verrou S sur un objet qui est, croyez moi sur parole, notre table).

SQL Profiler a enregistré l'événement Lock Escalation et le champ index_lock_promotion_count a augmenté, signe que nous avons bien eu affaire à une promotion de verrous. En effet le moteur aurait pu opter d'emblé pour un verrou de table.

Dans certains cas le verrou de type table peut avoir des conséquences désastreuses, le moteur ayant tendance a verrouiller la totalité de la table même quand on n'accède pas à la totalité de la table mais qu'un grande partie des données sont impactée par la requête.

SQL Server 2008 apporte des solutions intéressantes :

   ALTER TABLE Person.[Address] SET (LOCK_ESCALATION = xxx)

Où xxx peut avoir l'une des valeurs suivantes :

  • AUTO : Autorise la promotion de verrou au niveau partition si la table est partitionnée
  • DISABLE : Interdit la promotion de verrou sur cette table
  • TABLE : Mode par défaut et identique au comportement de la version 2005

Dans les versions précédentes, un peu moins d'options :

Il est possible de désactiver la promotion de verrou au niveau de l'instance à l'aide des Trace Flag 1211 et 1224. Le premier désactive la promotion de verrou de manière inconditionnelle, tandis que le second l'autorise en cas de manque de mémoire.

Pour plus de détails sur ces Trace Flags : http://msdn.microsoft.com/fr-fr/library/ms188396.aspx

Il y a une solution aussi plus orientée bricolage :

BEGIN TRANSACTION

DELETE FROM Person.Address WHERE 1 = 0

On me prend généralement pour un fou lorsque je tape cette requête… =< :o)

Eh oui, il n'y ni commit, ni rollback… Et il faut conserver la connexion ouverte. Cette requête a bien pour effet d'interdire la promotion de verrou au niveau table.

Pour approfondir, l'aide en ligne à une section complète sur le sujet : http://msdn.microsoft.com/fr-fr/library/ms184286.aspx

Les questions avec les réponses cette fois ci... Félicitations aux gagnants !

Pourquoi la dernière requête permet d'elle d'éviter la promotion de verrou au niveau table ?

Un verrou de type IX est posé sur la table, et est maintenu dessus étant donné que la transaction n'est pas cloturée.
Comme le verrou IX est incompatible avec les verrous S et X le moteur de base de données ne peut plus vérrouiller le niveau table, il est ainsi obliger de verrouiller à un niveau inférieur.
La solution est tout de même moins flexible et moins sûre que celle de 2008.

Comment faire pour conserver la session ouverte, et exécuter automatiquement cette requête au démarrage de SQL Server ?

Effectivement démarrer un job dans l'agent de manière automatique au démarre de celui-ci est la méthode la plus simple.

Bons verrous…

SQL Server 2008 : Release Candidate 0 téléchargement accessible à tous (RC0 – Beta)

Disponible aux abonnés TechNet ou MSDN depuis quelques jours déjà ( http://blogs.codes-sources.com/christian/archive/2008/06/06/sql-server-2008-release-candidate-0-disponible-en-t-l-chargement-rc0-beta.aspx ) , la RC0 est maintenant disponible pour tous…

A noter un nouveau supplément pour Visio (tout en bas) et pas mal d'ajouts dans le Feature Pack pour SQL Server 2008 !

Voici le détail des liens…

SQL Server 2008 RC0 lui-même avec toutes les éditions :

En anglais : http://www.microsoft.com/downloads/details.aspx?FamilyID=35f53843-03f7-4ed5-8142-24a4c024ca05&DisplayLang=en

En français : http://www.microsoft.com/downloads/details.aspx?FamilyID=35f53843-03f7-4ed5-8142-24a4c024ca05&DisplayLang=fr

Le « Feature Pack » de SQL Server 2008 :

En anglais : http://www.microsoft.com/downloads/details.aspx?FamilyID=089a9dad-e2df-43e9-9cd8-c06320520b40&DisplayLang=en

En français : http://www.microsoft.com/downloads/details.aspx?FamilyID=089a9dad-e2df-43e9-9cd8-c06320520b40&DisplayLang=fr

La documentation en ligne de SQL Server 2008 :

En anglais : http://www.microsoft.com/downloads/details.aspx?FamilyID=19db0b42-a5b2-456f-9c5c-f295cdd58d7a&DisplayLang=en

En français : http://www.microsoft.com/downloads/details.aspx?FamilyID=19db0b42-a5b2-456f-9c5c-f295cdd58d7a&DisplayLang=fr

Release Notes :

En anglais : http://www.microsoft.com/downloads/details.aspx?FamilyID=daf00920-7214-418a-a4b0-727f4ce08f81&DisplayLang=en

En français : http://www.microsoft.com/downloads/details.aspx?FamilyID=daf00920-7214-418a-a4b0-727f4ce08f81&DisplayLang=fr

Addon Reporting Services pour Sharepoint :

En anglais : http://www.microsoft.com/downloads/details.aspx?FamilyID=c67a9276-bc20-444c-b60d-8500f4b8d713&DisplayLang=en

En français : http://www.microsoft.com/downloads/details.aspx?FamilyID=c67a9276-bc20-444c-b60d-8500f4b8d713&DisplayLang=fr

Addon Visio pour SQL Server 2008

En anglais : http://www.microsoft.com/downloads/details.aspx?FamilyID=779561de-c704-4584-80ac-7e4348c927c0&DisplayLang=en

En français : http://www.microsoft.com/downloads/details.aspx?FamilyID=779561de-c704-4584-80ac-7e4348c927c0&DisplayLang=fr

Bon téléchargement…

Divers : Le top 10 de l’année sur SQL Server de ce blog

Après une année de suivi de la fréquentation via Google Analytics, voici quelques petites stats :

 

  • 178 343 visites
  • 239 403 pages vues

Pour le Top 10 :

 

  1. Conserver la date ou l’heure d’un datetime (Comparaison des méthodes)
         http://blogs.codes-sources.com/christian/archive/2007/04/29/sql-server-conserver-la-date-ou-l-heure-d-un-datetime-comparaison-des-methodes.aspx
  2. Pourquoi mon fichier de log/ldf est il aussi gros ? Comment diminuer sa taille ?
         http://blogs.codes-sources.com/christian/archive/2007/02/12/sql-server-faq-sql-pourquoi-mon-fichier-de-log-ldf-est-il-aussi-gros-comment-diminuer-sa-taille.aspx
  3. La vérité sur le LIKE
         http://blogs.codes-sources.com/christian/archive/2007/12/11/sql-server-la-verite-sur-le-like.aspx
  4. Licences et prix
         http://blogs.codes-sources.com/christian/archive/2006/12/17/sql-server-2005-licences-et-prix.aspx
  5. Comment calculer l'âge du capitaine (différences sur des dates) ?
         http://blogs.codes-sources.com/christian/archive/2007/07/02/SQL-Server-Comment-calculer-differences-dates.aspx
  6. Les 3 différents types d’INSERT
         http://blogs.codes-sources.com/christian/archive/2007/10/24/sql-server-les-3-diff-rents-types-d-insert.aspx
  7. Copier une table avec ses données ou uniquement sa structure
         http://blogs.codes-sources.com/christian/archive/2007/09/21/sql-server-copier-une-table-avec-ses-donn-es-ou-uniquement-sa-structure.aspx
  8. Dépassez les 2 Go de mémoire pour votre instance
         http://blogs.codes-sources.com/christian/archive/2007/05/25/sql-server-faq-sql-d-passez-les-2-go-de-m-moire-pour-votre-instance.aspx
  9. Changer la collation (Classement / Ordre de tri) d’une base de données
         http://blogs.codes-sources.com/christian/archive/2007/08/17/sql-server-changer-la-collation-classement-ordre-de-tri-d-une-base-de-donn-es.aspx
  10. Les verrous et l’utilisation de NOLOCK
         http://blogs.codes-sources.com/christian/archive/2007/03/08/sql-server-les-verrous-et-l-utilisation-de-nolock.aspx

Merci à tous ceux qui consultent ce blog !

 

Bonne lecture…

Posté le par christian | 2 commentaire(s)
Classé sous : ,

SQL Server 2008 : Recherche d’objets (tables, vues, etc.)

Nouvelle fonctionnalité de SQL Server 2008 dans Management Studio ou retour d'une veille fonction au choix, car en effet dans l'analyseur de requête sous SQL Server 2000 il était possible de procéder à une recherche de ce type.

Pour accéder à cette fonctionnalité il vous faudra ouvrir la fenêtre « Détails de l'explorateur d'objets » ou « Objet Explorer Details », accessible par la touche F7.

La zone servant à saisir le texte recherché est tous en haut de la fenêtre sous forme de ListBox qui vous permet d'aller directement aux derniers éléments recherchés. Le texte utilise les symboles du LIKE pour réaliser la recherche. Le contexte de la recherche est fonction de la sélection dans l'explorateur d'objet à gauche, si une base est sélectionnée la recherche se fera sur celle-ci, si le serveur est sélectionné la recherche se fera sur toutes les bases de données.

Seule petite déception, pas de possibilité de recherche au travers des colonnes des tables. Vous pourrez vous retourner vers ce script en cas de nécessité : http://www.sqlfr.com/codes/SQL-SERVER-2005-RECHERCHE-CHAMPS-LEURS-NOMS-MULTI_42129.aspx

Bonne recherche…

Posté le par christian | 0 commentaire(s)
Classé sous : ,

SQL Server 2008 : Barre de couleur en bas de vos connexions

Une nouveauté de SQL Server, qui de prime abord, ne paye pas de mine, mais très intéressante si vous avez des serveurs en production et qu'il vous ai déjà arrivé par mégarde d'exécuter la mauvaise requête dans la mauvaise fenêtre de Management Studio.

Dans les propriétés des serveurs enregistrées, cliquez sur les propriétés d'un serveur. Vous aurez la boîte de dialogue comme ci-dessous. Allez dans le 2ème onglet. Dans celui-ci ci cochez « Use custom color » puis sur le bouton « Select…» choisissez votre couleur favorite. Je ne saurais que trop vous conseiller le rouge vif pour vos serveurs de production, et des couleurs plus claires pour les autres.

Ce qui donne dans mon cas pour la fenêtre de requête, la barre d'état en vert.

Personnellement je trouve cette fonctionnalité vraiment très bien, le nombre de fois où j'ai pu me tromper de serveur. Maintenant çà n'arrivera plus !

Bonne couleur…

Posté le par christian | 0 commentaire(s)

SQL Server : Déterminer qui a son anniversaire aujourd’hui (manipulation de date et d’index)

C'est une question toute bête me direz vous : Qui a son anniversaire aujourd'hui ? Toute bête mais qui amène à des calculs tortueux. J'avais déjà traité le sujet sur le calcul de l'âge : http://blogs.codes-sources.com/christian/archive/2007/07/02/SQL-Server-Comment-calculer-differences-dates.aspx

Dans ce cas, pourquoi ne pas retrouver les personnes ayant leur anniversaire aujourd'hui par ce biais là ? Parce que çà implique d'utiliser des fonctions sur les champs présent dans le WHERE et interdit l'usage des index… Ah, j'ai du oublié de vous dire que ma table comporte 1 million de personnes, rien que çà !

La définition de la table est la suivante :

CREATE TABLE dbo.NewP
    p_id int IDENTITY(1,1) NOT NULL, 
    FirstName nvarchar(50) NOT NULL, 
    LastName nvarchar(50) NOT NULL, 
    BirthDate date NULL
CONSTRAINT pk_x PRIMARY KEY NONCLUSTERED ( p_id)
GO

Ici j'utilise le type date de SQL Server 2008 pour éviter d'alourdir le code encore un peu plus. Si vous cherchez une méthode pour supprimer les composantes heures du type datetime de SQL Server, c'est par ici que çà se passe : http://blogs.codes-sources.com/christian/archive/2007/04/29/sql-server-conserver-la-date-ou-l-heure-d-un-datetime-comparaison-des-methodes.aspx

Après mûre réflexion je pense à une méthode qui devrait être intéressante, en passant par la table de nombre détaillé ici : http://blogs.codes-sources.com/christian/archive/2008/05/28/sql-server-g-n-rer-une-table-de-nombres-ou-une-fonction.aspx

Si je reformule le problème je pense que vous comprendrez mieux. Je recherche toutes les personnes dont la date de naissance est aujourd'hui moins 1 an, 2 ans, etc. D'où l'intérêt de la table de nombre. La requête s'écrira ainsi :

select *
from dbo.NewP
where BirthDate in
        select DATEADD(year, -nums, cast(getdate() as DATE)) 
        from dbo.Nombres 
        where nums < 100 -- Pas plus de 100 ans, mais bon à vous de voir ! 
    )

  • Renvoie 3000 lignes sur 1,5 million
  • 58 sec d'exécution
  • 118 sec de CPU utilisé (j'ai un dual core donc faute au parallélisme dans la requête)
  • 2,5 millions de pages lues

Il est possible de mettre un BETWEEN sur le champ nums pour avoir une tranche d'âge. La requête obtenue est lisible et devrait permettre l'utilisation d'index… Enfin un bon index, j'ai donc ajouté un index clustered sur le champ BirthDate, en croisant les doigts car vue la type de requête je doutais franchement que SQL Server aille utiliser l'index dans un tel cas même si cela se révélait intéressant pour lui.

    create clustered index ix_gghg on dbo.NewP(BirthDate)

Et c'est bien le cas, pas d'utilisation d'index, car cela renvient à rechercher plusieurs plages de valeurs contigües. Les performances restent les même que la requête précedente.

Je cherche une autre piste pour récupérer mes enregistrements plus rapidement en profitant d'un index. Ici je vais créer un nouveau champ qui sera calculé et indexé. Que vais-je mettre dedans ? Tout simplement une combinaison des mois et jour des dates de naissances de tout le monde. Ensuite je créée un index là-dessus, cette fois ci les plages de valeurs seront contigüe, l'index se révélera utilisable, toujours à condition d'utiliser le bon.

    alter table dbo.NewP add anniv as cast((month(BirthDate) * 100 + DAY(BirthDate)) as smallint)

Je le convertis en smallint, pour avoir une taille d'index encore plus petite, la probabilité de dépasser la précision du 16 bits signé étant nulle ici. Puis j'ajoute un index :

create nonclustered index ix_test on dbo.NewP(anniv) include(p_id)

Il est effectivement possible de créer un index sur un champ calculé, il y a quelques règles à respecter quant aux types de fonctions utilisables. Ici la clause INCLUDE me permet d'ajouter la clef primaire de la table à l'index comme valeur et non pas comme champ clef. Il ne pourra donc pas servir à la recherche, mais uniquement être dans le SELECT.

Mon idée est d'utiliser une méthode de pagination pour présenter les résultats 10 par 10 et non pas la totalité des personnes ayant leur anniversaire ce jour (pour le faire remplacer l'index précédent par un index clustered sans include). La requête se traduit comme suit :

with paging
as

    select ROW_NUMBER() over(order by p_id) as num, p_id 
    from dbo.NewP 
    where anniv = month(cast(getdate() as DATE)) * 100 + day(cast(getdate() as DATE))
)
select * from paging 
    join dbo.NewP as tb on paging.p_id = tb.p_id
where num between 1 and 10;

Les résultats sont assez exceptionnels :

  • Renvoie 10 lignes sur 1,5 million (normal on pagine)
  • 0 sec d'exécution
  • 0 sec de CPU utilisé
  • 52 pages lues

Moralité les gains sont importants surtout si la quantité de données de la table de base est importante.

Quand est ce qu'il faut avoir recours à ce type d'optimisation ? Je dirais très rarement, çà dépendra essentiellement du temps de réponse de la requête de départ et de votre volume de données. Si cette requête est essentielle pour vous et qu'il y a peu d'écriture dans la table dans ce cas oui. Evitez de faire cela si vous avez de grandes quantités d'écriture dans cette table.

Maintenant voyons les défauts de la méthode : Je ne peux pas requêter facilement sur une plage de date sans me torturer l'esprit. Les mois ne faisant pas tous 30 jours, c'est à vous de manuellement trouver les bornes du BETWEEN à appliquer sur le champ anniv !

Bon anniversaire…

SQL Server : Renvoyer les données aléatoirement Tri aléatoire ou tirage aléatoire

Comment réaliser un tri aléatoire d'une table ou récupérer de la même façon une partie seulement d'une table ?

La première hypothèse serait d'utiliser la fonction RAND() de SQL Server qui génère un nombre aléatoire compris entre 0 et 1.

SELECT *
FROM Person.Address
ORDER
BY RAND()

Même en exécutant plusieurs cette requête le résultat reste identique et non trié aléatoirement (le jeu de données est renvoyé dans l'ordre physique où il se trouve dans la base de données).

La raison est que le moteur réalise toujours une évaluation de la fonction une fois pour toute, pour la portée de la requête. Pour s'en convaincre, exécutez la variante de la requête ci-dessus :

SELECT *, RAND()
FROM Person.Address

La dernière colonne contient pour chaque enregistrement la même valeur. Plusieurs raisons à cela : conserver la consistance des données au travers de la requête, et conserver de bonnes performances. Peut de fonctions sont des exceptions à cette règles, voyons en une : NEWID()

NEWID() renvoie une valeur binaire de 16 octets générée par un générateur pseudo aléatoire. Cette valeur est belle est bien aléatoire et se veut unique (à 99,9999%), elle fait donc exception à la règle ci-dessus.

Testons notre requête avec cette variante :

SELECT *
FROM Person.Address
ORDER BY NEWID()

Le résultat est cette fois bien aléatoire et change à chaque exécution. Pour réaliser un tirage d'un certains nombres d'enregistrement par cette méthode, il faudra lui ajouter la clause TOP (à noter que les parenthèses sont optionnelles) :

SELECT TOP(1) *
FROM Person.Address
ORDER BY NEWID()

Cette méthode bien que faisant exactement ce que nous souhaitons peut se révéler gourmande en ressources dans la mesure où le moteur va être obligé de calculer un GUID pour chaque ligne dans la table, imaginez donc une table de 100 millions d'enregistrements.

SQL Server 2005 introduit une nouvelle fonction permettant de lister plus efficacement des données de manière aléatoire :

SELECT *
FROM Person.Address TABLESAMPLE(300 ROWS)

Cette fonction prend 2 types d'arguments, le nombre d'enregistrement souhaité ou le pourcentage d'enregistrements souhaités. Bien que très efficace cette fonction souffre tout de même d'un problème :

SELECT *
FROM Person.Address TABLESAMPLE(1 ROWS)

Testez cette requête plusieurs fois d'affiler et vous constaterez que de temps en temps vous aurez des résultats sous forme de plusieurs lignes, mais pas une, ou rien !

Le comportement de TABLESAMPLE est de filtrer au niveau des pages de la table (bloc de 8ko comprenant les données). Cette méthode bien que plus efficace que la notre, donne des effets surprenants, cela peut être gênant tout dépend de ce que vous souhaitez faire.

D'où l'idée de combiner les 2 :

    SELECT TOP(1)
    FROM Sales.SalesOrderDetail TABLESAMPLE(300 ROWS
    ORDER BY NEWID();

Ce qui fonctionne comme attendu… Attention le chiffres tu TABLESAMPLE est à déterminer de manière à ce qu'il renvoie toujours au moins un enregistrement, sinon la requête présente ne renverra aucuns résultats.

Et les performances dans tout çà (la table de test comprend 121000 enregistrements) ?

Requête à base de TOP et ORDER NEWID() seule :

  • 1356 pages lues
  • 249 ms de CPU consommé
  • Sur 1000 exécutions 129 s de temps d'exécution

Requête à base de TOP et ORDER NEWID() + TABLESAMPLE :

  • 3 pages lues
  • 0 ms de CPU consommé
  • Sur 1000 exécutions 750 ms de temps d'exécution

Clairement le TABLESAMPLE remporte la palme ici.

Bons tris…

SQL Server 2008 : Release Candidate 0 disponible en téléchargement (RC0 - Beta)

SQL Server 2008 enfin à la phase de Release Candidate, c'est à dire aux betas éligibles à une sortie en version définitive. Cette version est aussi « Feature Complete » c'est-à-dire que toutes les fonctionnalités de la version finale de SQL Server 2008 y sont.

Elle est pour le moment uniquement disponible pour les abonnés TechNet et MSDN.

A noter que le téléchargement est composé d'une seule et unique image ISO (DVD) qui contient toutes les éditions et plateformes de SQL Server. La seule chose à choisir sera la langue d'installation.

Parmi les nouveautés depuis la beta du mois de février :

  • Nouveau logo et design revu des « splash » screens
  • Fonctionnalité de recherche d'objet dans Management Studio
  • Débuggeur T-SQL dans Management Studio
  • Nouveau Moniteur d'activité
  • Quelques autres en vrac : amélioration du INSERT / SELECT en mode bulk, ajout de Hash pour les plans et les requêtes dans certaines DMV et DMF.

J'aurais je pense l'occasion de vous en montrer quelques unes, dans les jours qui viennent…

Bon téléchargement…

Posté le par christian | 0 commentaire(s)

SQL Server : Exporter tous les lots DTS d’un serveur sous forme de fichiers

Les lots DTS lorsqu'ils sont stockés sur serveur, le sont dans la base de données système msdb, plus précisément dans la table sysdtspackages.

D'où l'idée de faire un lot SSIS (Integration Services) qui se charge d'exporter le contenu de cette table sous la forme de fichiers portant l'extension « .dts ».

Il faut au niveau du chargement du contenu de la table, que celle-ci contient l'historique des versions des lots DTS. La requête prend alors la forme suivante :

select name, packagedata
    from msdb..sysdtspackages as dt1
    where not exists
                (
                    select *
                    from msdb..sysdtspackages as dt2
                    where dt2.createdate > dt1.createdate
                        and dt2.name = dt1.name
                )

Le lot SSIS (joint en pièce jointe de ce billet) présente une tâche qui un DataFlow se présentant comme suit :

Celui-ci est simple, il y a une tâche d'extraction dont le travail est de prendre le contenu binaire et créer le fichier relatif pour chaque enregistrement. La tâche d'ajout du chemin permet quand à elle, de spécifier le nom et le chemin du fichier « .dts ». Par défaut les fichiers sont extraits dans le répertoire de travail de SSIS ou le répertoire où se trouve le lot SSIS.

La connexion vers le serveur SQL Server dans le lot est à changer avant l'utilisation du lot. Cela peut être fait dans la boîte de dialogue qui s'ouvre avant l'exécution du lot.

Bon export…

Posté le par christian | 0 commentaire(s)
Classé sous : ,

Attachment(s): ExtractDTS.zip

Visual Studio Team System Database Edition : Support d’autres moteurs de base de données que SQL Server

Microsoft a annoncé au début de la semaine le support de IBM DB/2 dans Visual Studio Team System Database Edition…

http://blogs.msdn.com/gertd/archive/2008/06/04/datadude-goes-multi-platform.aspx

D'autres moteurs de base de données devraient venir, espérons le, et être disponible dans les prochaines versions de cet outil.

Bonne nouvelle…

Plus de Messages Page suivante »


Les 10 derniers blogs postés

- ssdl view et TPT par Matthieu MEZIL le il y a 23 heures et 33 minutes

- L'injection SQL n'est PAS un problème QUE pour les développeurs web ! par CoqBlog le 07-05-2008, 01:08

- Un outil pour réaliser des animations WPF basées sur des équations de Bézier par Perspective le 07-04-2008, 21:45

- Sandcastle et CodePlex : le verdict par CoqBlog le 07-04-2008, 20:53

- ssdl view et TPH par Matthieu MEZIL le 07-04-2008, 19:12

- Webcasts sur le Parallel Framework disponibles par Matthieu MEZIL le 07-04-2008, 17:26

- [Silverlight] - Comprendre et Débuter avec Silverlight par Danuz le 07-04-2008, 12:41

- SharePoint : Nouvel article sur l'exportation et Importation de sites SharePoint par Blog Technique de Romelard Fabrice le 07-04-2008, 01:00

- ImagineCup 2008 Final in Paris: Day 1 par Richard Clark le 07-03-2008, 22:48

- PowerShell : Comment utiliser un ENUM .NET dans un script PowerShell par Blog Technique de Romelard Fabrice le 07-03-2008, 18:09