Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

SQL Server 2008 R2 : C'est pour les tous premiers jours du mois de Mai 2010

On se rapproche de plus en plus de la date fatidique... Jusqu'à présent indiquée pour le premier semestre 2010, on connait maintenant plus précisément le mois de sortie...

Ou même, si on croise les informations trouvées par Patrick sur le site du TPC, la date butoir de sortie du produit.

SQL Server 2008 R2 devrait sortir entre le 1er et le 9 Mai 2010 !

Plus d'infos

http://blogs.technet.com/dataplatforminsider/archive/2010/01/19/sql-server-2008-r2-gets-an-official-date.aspx

et


http://blogs.codes-sources.com/patricg/archive/2009/12/01/date-de-disponibilit-de-sql-server-2008-r2-et-d-office-2010.aspx

Bonne attente...

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

Certifications : Retour de la seconde chance du 13 janvier au 30 juin 2010 sur les certifications Microsoft

Celles et ceux qui veulent se certifier peuvent profiter du retour de l'offre seconde chance, qui consiste à vous offrir une 2ème opportunité pour passer une certification MCP Microsoft si vous avez échoué une première fois et cela pour un prix identique.

Pour en bénéficier il faudra passer une certification Microsoft durant la période indiqué dans un centre de certification Prometric. En cas d'échec la seconde certification est à passer avant le 30 juin.

J'aime beaucoup dans l'email que j'ai reçu la mention suivante :

"Microsoft does not guarantee that candidates that take exams will pass."

C'est vrai que c'est bien de le préciser ;o)

Inscriptions ici : http://www.prometric.com/Microsoft/default.htm

Bonnes certifications…

 

Posté le par christian | 0 commentaire(s)

TechDays 2010 : Le lundi c’est la fête du DBA avec le DBA Day

A l'initiative de M. le chef de produit SQL Server de Microsoft France alias Lionel Billon, le Lundi 8 sera la journée des administrateurs de bases de données.

En effet, une série complète de sessions dédiées à SQL Server sera donnée, et des sessions techniques de haut niveau s'il vous plaît !

En voici la liste :

  • Plénière J1
    • Infrastructure et développement des systèmes d'informations agiles
  • 11:00 - 12:00
    • DBA DAY - Administrer facilement des environnements SGBD hétérogènes
  • 13:00 - 14:00
    • DBA DAY - Très haute disponibilité & Optimisation des performances
  • 14:30 - 15:30
    • DBA DAY - Exploitation retour d'expériences
  • 16:00 - 17:00
    • DBA DAY - Table ronde - l'avenir du métier de DBA : BI, cloud computing, technologies émergentes
  • 17:30 - 18:30
    • DBA DAY - Consolidation et virtualisation des bases de données

Ou sur le site officiel des TechDays : http://www.microsoft.com/france/mstechdays/programmes/parcours.aspx?DomID=fc768892-1aae-44bd-948d-3269d1e19b3a

J'aurais normalement (à moins d'une autre annulation de dernière minute) l'occasion de vous retrouver pour certaines d'entre elle, dont la session sur la Très Haute Disponibilité avec Christophe Laporte et Frédéric Pichaut.

D'autres évènements pour les DBA devraient être prévus durant cette journée, une occasion unique de rencontrer d'autres professionnels du même domaine.

Bon DBA-thon ;o)

TechDays 2010 : Une session sur la sécurité avec SQL Server [Annulé]

Et de une ! Une petite session sur la sécurité avec SQL Server cette année, pour le cru 2010 des Microsoft Techdays à Paris. Première session de la série que j'aurai l'occasion de donner au mois de février.

Le programme en exclu :

SQL Server et la sécurité

  • Quels sont les risques ?

Sécuriser le périmètre du serveur

  • L'environnement physique du serveur et ses accès
  • Sécurisation du réseau pour un serveur de données
  • Séparation des privilèges d'administrateur système et de DBA
  • Se protéger des désastres naturels et des erreurs humaines

Sécuriser les applications

  • Authentification unique sur l'application et le serveur de bases de données (SSO)
  • Comment se protéger de l'injection de code SQL
  • Auditer et suivre les accès aux données
  • Masquer les données et interdire certaines opérations
  • Et du coté des outils décisionnels ?

Définir la politique de sécurité de vos serveurs

  • Quelques exemples de politiques de sécurité avec SQL Server
    • Pour des éditeurs de logiciels
    • Pour des secteurs « sensibles »
  • Et les environnements de test, supervision et développement ?
  • S'assurer de l'unicité et du respect des règles mises en place
  • Social Engineering ?

Les habitués auront peut être remarqué que je pars d'un contenu 100% inédit. Et pour cause çà sera la 3ème année que je donne cette session, l'occasion pour moi de renouveler totalement le contenu !

Je suis ouvert aux commentaires pour éventuellement ajouter ou retirer du contenu, mais n'oubliez pas que les sessions font à peine plus d'une heure !

Bonne session…

PS : Il y a pour le moment une coquille dans le planning en ligne et l'intitulé et le contenu de la session sont erronés. Je vous mets un lien dès que c'est corrigé.

UPDATE : En fait j'ai appris très tard hier (du coup tôt ce matin) que la session avait été annulée, bref sympa de la part de MS, je vais pouvoir jeter le contenu préparé !

SQL Server : TOP dynamique, ancienne et nouvelle méthode

Il est possible de ne renvoyer qu'un nombre limité d'enregistrement dans une requête. Cela est possible directement via la clause TOP depuis SQL Server 2005 et à condition de mettre les parenthèses qui deviennent obligatoire dans la syntaxe :

DECLARE @count int

SET @count = 5

SELECT TOP(@count) * FROM dbo.MaTable

Il existe toujours, bien que cette méthode soit annoncée comme retiré d'une prochaine version, la possibilité de le faire via SET ROWCOUNT :

DECLARE @count int

SET @count = 5

SET ROWCOUNT @count

SELECT * FROM dbo.MaTable

Et on pense à remettre à 0 (réinitialise et renvoie toutes les lignes) après usage car ce SET s'applique à toutes les requêtes.

SET ROWCOUNT 0

Cette seconde méthode présente l'avantage de fonctionner sur les versions précédent SQL Server 2005. Dans tous les cas vous éviterez ainsi l'utilisation du SQL Dynamique.

Bonne sélection…

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

SQL Server : Fin du support de SQL Server 2005 SP2, c’est demain

Pour celles et ceux qui n'aurait pas encore fait la mise à jour vers SQL Server 2005 Service Pack 3 c'est le moment. Faute de quoi, vous n'aurez plus de mises à jour cumulative de la part de Microsoft pour votre version et vous risquez de ne pouvoir accéder au support technique et ce dès le 12 janvier, c'est-à-dire demain !

SQL Server 2005 Service Pack 3 : http://www.microsoft.com/downloads/details.aspx?displaylang=fr&FamilyID=ae7387c3-348c-4faa-8ae5-949fdfbe59c4

Prochaine version à voir son support disparaitre, SQL Server 2008 le 13 avril prochain, seul SQL Server 2008 Service Pack 1 et plus seront supportés à cette date.

SQL Server 2008 Service Pack 1 : http://www.microsoft.com/downloads/details.aspx?FamilyID=66ab3dbb-bf3e-4f46-9559-ccc6a4f9dc19&displaylang=fr

Bonne mise à jour...

Posté le par christian | 0 commentaire(s)

SQL Server : L’après SQL Server 2008 alias SQL11

Avec SQL Server 2008 R2 qui est annoncé pour la première moitié de cette année, que nous réserve Microsoft pour la suite ? La version suivante se nomme en interne SQL11, car celle-ci sera la prochaine version majeure du moteur relationnel soit la version 11.00 de SQL Server.

En effet SQL Server 2008 R2, dont le numéro de version est 10.50, apporte beaucoup de nouveautés côté Business Intelligence et en cela surpasse SQL Server 2008, mais procure relativement moins de nouveautés côté relationnel. SQL Server 2008 R2 est vue par les équipes de développement comme une version dite « BI Refresh », même si certaines modification côté relationnelle la rende indispensable pour nombre d'utilisateurs et de clients (Edition DataCenter et son support de 256 cœurs, compression des types Unicode, support de la compression des Sauvegardes dès l'édition Standard, nouveautés côté gestion des serveurs et déploiement d'applications et StreamInsight).

Malheureusement peu d'information publique ou officielle sur cette version. Beaucoup de bugs ou de demande de fonctionnalités dans Connect (https://connect.microsoft.com/sqlserver) sont marqués comme potentiellement disponible dans cette version, ce qui laisse augurer beaucoup de nouveautés. Concernant la date de disponibilité de cette version, en se basant sur les indications de Microsoft elle serait de 3 ans après la date de sortie de SQL Server 2008, ce qui ferait que SQL11 sortirait en 2011 !

Dans tous les cas, beaucoup d'annonce devraient avoir lieu dès cette année sur la prochaine version majeure du moteur relationnel de SQL Server !

Bonne année...

 

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

SQL Server : Calcul du numéro de semaine ISO depuis un type date/time

C'est un grand classique sur SQL Server, ce dernier ayant un calcul de semaine non conforme à la définition ISO.

Que faire ?

Eh bien, soit vous êtes sous SQL Server 2008 et vous avez de la chance, car la fonction DATEPART permet de le faire :

SELECT DATEPART(ISO_WEEK, '20090801')

Soit vous êtes dans une autre version, auquel cas il faudra utiliser une fonction maison (dernier post dans le thread):

http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=60510

Clairement, gros avantage à SQL Server 2008, car les fonctions scalaires ne sont pas ce qu'il y a de plus efficace dans SQL Server. Mais c'est toujours utile d'avoir de ce genre de calcul sous la main.

Bon calcul…

 

Posté le par christian | 0 commentaire(s)

Techdays : Souvenir de 2007

C'est la 4ème année de TechDays, l'occasion de revenir en arrière un peu, avec les photos ci-dessous.

 

Mais qu'est ce donc ? C'est le prix que j'avais obtenu en 2007, pendant la soirée des communautés Days qui eu lieu en même temps que les techDays en 2007 :

http://blogs.codes-sources.com/christian/archive/2007/02/08/techdays-qui-est-le-plus-mauvais-joueur-de-bowling.aspx

En même temps, c'était ma première année de MVP, de quoi se faire remarquer !!!

Bonnes photos…

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

SQL Server : Changer l’emplacement par défaut des fichiers de bases de données

Tout est dans le titre, comment changer l'emplacement où SQL Server met par défaut les fichiers MDF, NDF (données) et LDF (journal de transactions).

Via Management Studio, on se connecte dans l'explorateur d'objets à une instance. Sur le nom de l'instance on fait un clic droit puis propriétés.

On arrive alors sur la boîte de dialogue suivant, il suffit d'aller sur la page intitulé « Paramètres de bases de données » ou « Database Settings » :


Ou par script :

USE [master]
GO

EXEC xp_instance_regwrite N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer', N'DefaultData', REG_SZ, N'-nouveau-chemin-'
GO

EXEC xp_instance_regwrite N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer', N'DefaultLog', REG_SZ, N' -nouveau-chemin- '
GO

Attention cela ne s'applique qu'aux nouvelles bases de données créées sans spécifier les fichiers, et en aucuns cas aux bases de données existantes. Attentiopn à MSSQLServer qui reprsente dans mon cas l'instance par défaut mais qu'il remplacer par le nom de l'instance si celle-ci en a un.

Pour d'autres chemins je vous conseille un billet précédent :

http://blogs.codes-sources.com/christian/archive/2009/03/12/sql-server-d-terminer-o-se-trouvent-les-r-pertoires-par-d-faut.aspx

Bon emplacement…

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

SQL Server : Les modes de récupération de Bases de données (Et les mythes autour du mode simple)

Existant officiellement depuis la version 2000 sous les noms qu'on leur connait aujourd'hui, leurs caractéristiques existaient auparavant avec SQL Server 7 entre autres sous formes d'options de bases de données (tel qu'activer ou non les opérations faiblement journalisées).

A partir de la version 2000, ils sont aux nombre de 3 :

  • Journalisation Complete : « Full » 
  • Journalisation pour mises à jour par lot : « Bulk_Logged »
  • Journalisation Simple : « Simple »

Ce mode de récupération se paramètre au niveau de la base de données, à l'exception de certaines bases de données système (tempdb, qui est et reste en mode simple).

A partir de SQL Server 2000, le changement se fait par :

ALTER DATABASE MaBase SET RECOVERY { FULL | BULK_LOGGED | SIMPLE }

Ces modes de récupération définissent la manière dont se comporte le moteur de base de données pour remplir le journal de transaction. On peut se dire que l'impact de ce comportement sur les performances est direct, eh bien oui et non.

Mode de récupération complet / Full.

Passage en mode récupération complet :

ALTER DATABASE MaBase SET RECOVERY FULL

Attention le passage en mode récupération complet nécessite obligatoirement d'exécuter une sauvegarde complète après l'exécution de la commande précédente si vous étiez au préalable en mode de récupération simple. A la création d'une nouvelle base de données ayant le mode de récupération complet, tant qu'une sauvegarde complète n'est pas exécutée le comportement est celui du mode récupération simple !

Dans ce mode toute opération est journalisée de la même manière sans exception. C'est-à-dire qu'un INSERT ira écrire la même quantité d'information qu'un SELECT / INTO ou un BULK INSERT. Il n'y a donc en termes de performance aucunes différences entre ces commandes pour le chargement des données dans une table.

Idem pour les commande de création et de maintenance d'index, elles sont 100% journalisées, donc généralement assez lente et déconseillé dans ce mode hors des fenêtres de maintenance prévues à ces effets.

A noter tout de même que le TRUNCATE TABLE, qui est par définition non journalisé est aussi faiblement journalisé en mode Complet. En fait la seule contrainte d'un TRUNCATE TABLE est de pouvoir réaliser un ROLLBACK dans une transaction. Si cela est nécessaire, cette opération verrouillera les données de la table jusqu'à la fin de la transaction. Cette opération est donc, quelque que soit le mode récupération la plus efficace pour vider une table de son contenu.

Il a des contraintes au niveau de SQL Server qui vous forceront à rester dans ce mode de récupération. Citons entre autres la mise en place d'un miroir (mirroring).

Mode de récupération pour mises à jour par lot / Bulk Logged.

Passage en mode récupération faiblement journalisé (BULK LOGGED):

ALTER DATABASE MaBase SET RECOVERY BULK_LOGGED

Dans ce mode, un certain nombre d'opérations sont dites faiblement journalisées :

  • SELECT / INTO
  • BULK INSERT sur une table vide (et ses cousines : bcp, FastLoad, etc.)
  • CREATE INDEX (et par extension clef primaire et contrainte unique)
  • DBCC DBREINDEX / ALTER INDEX REBUILD
  • DROP INDEX (clustered index)
  • Ecriture ou modification d'un LOB (Large OBject, tel que varbinary(max) ou vachar(max) s'ils font plus de 8ko).

A cette liste s'ajoute à partir de SQL Server 2008 et à condition d'utiliser le TraceFlag 610 (http://blogs.codes-sources.com/christian/archive/2009/09/11/sql-server-quelques-trace-flags-utiles.aspx) au niveau serveur :

  • BULK INSERT sur table déjà remplie (et ses équivalentes)
  • INSERT sous certaines conditions

Dans ce mode, les opérations faiblement journalisées n'écrivent plus dans le journal de transactions leur progression (tout au moins le début et la fin de l'opération y sont consignés). Au lieu de cela, des pages systèmes contiennent la liste des extensions (bloc de 8 pages, soit 64 ko) modifiées par ces opérations via un bit dans ce type de page = 1 extension modifiée.

La caractéristiques des opérations faiblement journalisées est d'être facilement re-éxécutable sans avoir à consigner la progression de la modification des données. En effet le chargement d'un fichier texte par BULK INSERT nécessiterait juste de recharger ce même fichier avec la même commande. La création d'index nécessitera la même commande, etc.

Les données ainsi impactées sont copiées directement au moment de la sauvegarde du journal de transactions dans le fichier de sauvegarde. A aucuns moment ces données sont dans le journal de transactions lui-même elles sont exclusivement dans les fichiers de données !

BACKUP LOG mabase TO DISK = 'chemin\fichier'

Après cette commande, les pages systèmes permettant de suivre les opérations faiblement journalisées sont réinitialisées. Il est très fortement conseiller d'exécuter une sauvegarde du journal de transaction après chaque opérations de type listé plus haut, car sinon en cas de perte d'un ou plusieurs fichiers de données la récupération de la base de données pourrait être difficile ou compromise. En complément dans ce mode, pensez à garder vos fichiers d'import au moins jusqu'au sauvegarde différentielles ou complète, par précaution.

A noter que la journalisation faible pour les insertions de données se fait à quelques conditions strictes :

  • La table de destination des données doit être vide
  • La table doit être verrouillée à l'aide d'un verrou de type table (TABLOCK)
  • Ne s'applique qu'au BULK INSERT et opération similaires (en aucun cas à l'INSERT)

A partir de SQL Server 2008 et à condition d'activer le TraceFlag 610 :

  • La table doit être verrouillée à l'aide d'un verrou de type table (TABLOCK)
  • S'applique au BULK INSERT, même table déjà remplie et aux INSERT
  • Ne s'appliquera seulement si les pages de destinations des données ne contiennent pas déjà des enregistrements…
    • Il est par exemple probable que sur une petite quantité de données la journalisation soit complète.

Les conséquences de tout çà sont que seules les applications prévues pour optimiser ce type de traitement de données peuvent en profiter (utilisation explicite du BULK INSERT et du TABLOCK) et que ce n'est généralement pas juste en passant dans ce mode de récupération que les gains vont être visibles. Par contre en termes de développement, il est mieux de réaliser un développement utilisant ce type de commande, des SELECT / INTO au cas où le mode de journalisation serait BULK_LOGGED ou SIMPLE.

Mode de récupération simple / Simple.

Passage en mode récupération simple:

ALTER DATABASE MaBase SET RECOVERY SIMPLE

C'est le mode sur lequel il y a le plus de préjugé. En effet ce mode est identique en termes de performance au précédent ! Il n'y a aucune différence sur la manière de journaliser les opérations dans ce mode vis-à-vis du BULK_LOGGED.

La différence entre ce mode et le précédent, vient de la gestion interne du journal de transaction. Là où en mode de récupération BULK_LOGGED il faut sauvegarder le journal de transaction, le mode SIMPLE lui simplifie la gestion en exécutant automatiquement des opérations tronquant le contenu du journal. A chaque fois que les données stockées en mémoire sont inscrites dans les fichiers de données, le journal est tronqué.

En pratique dans ce mode de récupération ont augmentera la cadence des sauvegardes complètes et différentielles pour pallier l'absence de sauvegarde des journaux de transactions.

Quelques clarifications sur ce mode :

  • Il n'est pas plus performant que le BULK_LOGGED
  • Le journal de transaction peut grossir dans ce mode, car les transactions courantes l'utilisent
  • La réduction du journal de transaction n'est pas automatique
  • Les pertes de données sont possibles dans ce mode, mais à condition qu'un fichier de données ou le journal de transaction soit corrompu
  • Les DELETE sont totalement journalisés… Il n'existe pour le moment aucunes alternatives à ce comportement

Modes particuliers

Il existe et existera, 2 modes particuliers supplémentaires. Ils ne sont à proprement parlé pas des modes utilisable explicitement sur une base de données

Le premier est celui de tempdb, cette base de données est bien entendue en mode récupération simple. En réalité depuis SQL Server 2005, ce base de données est moins journalisée que les modes BULK_LOGGED et SIMPLE, en effet on part du principe que si le moteur de base de données est redémarré cette base de données est tout simplement recrée vide. Dès lors seuls les informations nécessaires à l'exécution des transactions (phase d'annulation, dite Undo) sont nécessaires, les informations nécessaire au démarrage (phase de Redo, qui ré-exécute les transactions dont les données n'ont pas été écriture dans les fichiers de données à l'arrêt de l'instance) de chaque base de données est de fait inutile pour tempdb.

De plus tempdb, bénéficie d'une optimisation concernant la mise en cache de ses table et une réutilisation des structures en cas de DROP / CREATE fréquent. Ce qui la rend plus perfomante en contrepartie de quoi la perte de données est garantie en cas de redémarrage de l'instance.

L'autre est un mode, dit SUPPLEMENTAL_LOGGING, en fait ce mode n'a tout simplement pas été mis en place pour le moment dans SQL Server. Il est apparu dans les premières versions de la documentation en ligne de SQL Server 2008 et a vite été retiré. Peut-être verra-t-il le jour dans une version ultérieure du moteur, son rôle devant être similaire à celui des moteurs concurrent, on ajoute un certain nombre d'information du journal, ceci pour aider les outils tiers lisant ce dernier.

J'essaye de faire un comparatif de performance entre ces modes dans un prochain billet.

Bonne récupération...

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

SQL Server : Le TOP 10 de mes articles techniques de 2009

Un petit récapitulatif des billets les plus vus de l’année 2009…

Pourquoi le journal de transaction grossit t’il (LDF) ?

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

Méthodes pour tronquer la date ou l’heure d’un datetime

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

Les secrets du LIKE

http://blogs.codes-sources.com/christian/archive/2007/12/11/sql-server-la-verite-sur-le-like.aspx

Comment dupliquer la structure d’une table

http://blogs.codes-sources.com/christian/archive/2007/09/21/sql-server-copier-une-table-avec-ses-donn-es-ou-uniquement-sa-structure.aspx

Les 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

Comment changer le classement (COLLATE) 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

Comment récupérer le mot de passe SA d’une instance ?

http://blogs.codes-sources.com/christian/archive/2007/01/18/sql-server-2005-r-cup-ration-du-mot-de-passe-de-sa.aspx

Tableau de synthèse des types de données de SQL Server jusqu’à 2008

http://blogs.codes-sources.com/christian/archive/2008/06/30/sql-server-tous-les-types-de-donnees-en-un-coup-doeuil.aspx

Tout savoir sur l’utilisation du NOLOCK

http://blogs.codes-sources.com/christian/archive/2007/03/08/sql-server-les-verrous-et-l-utilisation-de-nolock.aspx

TRUNCATE TABLE ou DELETE ?

http://blogs.codes-sources.com/christian/archive/2008/05/22/sql-server-delete-from-ou-truncate-table.aspx

Bonne lecture…

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

SQL Server 2008 R2 : Compression native des chaînes Unicode

C'est sans doute LA nouveauté de cette version côté moteur relationnel. Il est possible de comprimer les données Unicode, soit les types nvarchar et nchar. Cette nouveauté ne verra cependant le jour que dans les éditions DataCenter et Enterprise, ce qui est somme toute logique étant donné que la compression des données n'étant disponible que sous l'édition Enterprise avec SQL Server 2008.

En quoi est-ce une grande nouveauté ? Tout simplement car pour certains contenus, il est obligatoire de permettre le stockage de valeur Unicode. Mais celui-ci, pour la plupart des caractères de l'alphabet latin (le nôtre), double le nombre d'octets nécessaire au stockage. Certains alphabets comme ceux utilisé en Japonais nécessitent aussi un grand espace de stockage pour les chaînes de caractères.

Or, il existe un standard pour la compression de ces chaînes de caractères : http://unicode.org/reports/tr6/

Pour faire simple, ce standard de compression, permet en ajoutant un octet de gérer sur environ 1 octet chaque caractère d'un même alphabet (pour le cas des alphabets Latins et Grecs, soit 50% de gain en taille). Pour le cas des alphabets utilisés en Japonais, le gain est moindre mais tout de même intéressant (environ 15% de gain). En pratique, le gain est même un peu meilleur que le stockage en UTF-8.

Potentiellement si vous avez des colonnes de types nchar ou nvarchar le gain net de stockage de ces colonnes est de 50%, ce qui peut se chiffrer en giga-octets suivant vos bases de données.

Pour l'utiliser il faut activer la compression de ligne (ROW) ou de page (PAGE, qui utilise implicitement la compression de ligne) dans une table. Celles-ci existent depuis SQL Server 2008. Si vous importez une base de données depuis SQL Server 2008, il faudra forcer la reconstruction de la table (ALTER TABLE REBUILD), pour profiter de cette nouvelle compression.

Attention, car il y une limites : le type max (nvarchar(max) quel que soit son contenu) et l'ancien type LOB (ntext) ne peuvent profiter de cette compression. De plus, les limitations classiques de la compression des données s'appliquent, il y aura une légère augmentation de l'activité CPU.

Cette nouveauté peut à elle seule justifier l'investissement de cette nouvelle version.

En savoir plus :

http://blogs.msdn.com/sqlserverstorageengine/archive/2009/08/17/unicode-compression-in-sql-server-2008r2.aspx

et

http://blogs.msdn.com/sqlserverstorageengine/archive/2009/08/17/a-unicode-compression-example.aspx

Bonne compression…

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

MVP : UPDATE mvp SET annee += 1 WHERE speciality = ‘SQL Server’

Le titre parle de lui-même (enfin quoique). Ce n'était pas gagné cette année, mais heureux de rempiler pour une année de plus sur SQL Server !

Merci à tous les fidèles lecteurs de se blog…

Posté le par christian | 4 commentaire(s)

Divers : Les 10 pertes de données les plus insolites dans Programmez !

Pour finir cette année, un petit article fun :

http://www.programmez.com/actualites.php?id_actu=6491&xtor=EPR-144

Perso j'ai perdu une clef USB dans les toilettes de l'aéroport à Genève et je ne suis pas dans le classement :o(

Bonne fin d'année…

Posté le par christian | 0 commentaire(s)

Divers : Cadeau de Noël pour DBA

Ca n'était pas tout à fait sous le sapin ce matin, çà date d'une semaine environ de la part d'un ou d'une collègue:

et

On trouve dedans la balle antistres, lekit de mise en miroir et le tube de ... ? pour les problèmes de contention dans tempdb.Bref le cadeau idéal du DBA.

Joyeux Noël...

Posté le par christian | 2 commentaire(s)

SQL Server 2008 : Meilleure réutilisation des plans d’exécution avec 'optimize for ad hoc workloads' ?

C'est une nouvelle option de niveau serveur, qui a vu le jour dans le but d'éviter de noyer un serveur sous le poids de son cache de plan d'exécution.

En pratique tout code SQL avant son exécution doit être compilé. Le résultat de cette compilation s'appelle le plan d'exécution qui régira le comportement de la requête à l'exécution. Cette opération peut être longue et est couteuse en termes de temps processeur et doit généralement être évité quand cela est possible.

C'est là qu'intervient le cache des plans (pour être plus complet j'avais fait un topo là-dessus : http://blogs.codes-sources.com/christian/archive/2007/04/27/sql-server-requ-tes-sql-texte-adhoc-contre-proc-dures-stock-es.aspx ), qui permet lors de la deuxième exécution de repêcher le plan dans la cache, là où il a été stocké à la première exécution du code SQL.

Le problème est que si un très grand nombre de requête n'est exécuté qu'une seule fois, le cache de plan est rempli de plans inutiles. Résultat il consomme beaucoup de mémoire (surtout en 64 bits) et la recherche dans celui-ci devient moins efficace.

Pour éviter cela, SQL Server 2008 a introduit l'option serveur 'optimize for ad hoc workloads'.

Elle s'active avec le code suivant :

EXEC sys.sp_configure N'show advanced options', N'1'
GO
RECONFIGURE
GO
EXEC sys.sp_configure N'optimize for ad hoc workloads', N'1'
GO
RECONFIGURE
GO
EXEC sys.sp_configure N'show advanced options', N'0'
GO
RECONFIGURE
GO

Il est aussi possible de passer dans les propriétés serveur de l'instance par l'interface graphique de Management Studio :o)

Ce que permet cette option, est que lors de la première exécution, on compile le requête on obtient le plan. Jusque-là pas de changement, mais ce plan n'est pas mis en cache, on conserve juste la trace de son emprunte(Hash). La mise en cache se fera uniquement à la 2ème exécution si la comparaison de l'emprunte se fait.

A noter que cette emprunte (Hash) est nouvelle sous SQL Server 2008, on la retrouve :

select query_hash, query_plan_hash from sys.dm_exec_query_stats

Ce qui fait que dans ce mode, le plan n'est pas stocké à la première, mais à la seconde exécution. Cela se révèle très efficace si les requêtes sont générées à la volée par l'application ou que vous avez beaucoup de code dynamique, non réutilisé. Par contre, peu d'intérêt en cas d'utilisation systématique de procédures stockées.

Bonne exécution…

SQL Server : Performance d’un code TSQL face à un code .Net (SQLCLR) - Split de chaînes

Comme indiqué dans les commentaires d'un précédent billet, qu'en est-il des performances entre du code .Net intégré à SQL Server (SQLCLR) face à du code Transact-SQL pur et dur ? (http://blogs.codes-sources.com/christian/archive/2009/12/17/sql-server-cr-er-une-fonction-de-type-table-tvf-via-net-sqlclr-exemple-d-un-split-de-cha-ne.aspx)

Tout dépend du type de code que vous comparez, dans mon exemple ici, je reprends l'exemple du Split exposé précédemment.

Le test ne se veut pas exhaustif, j'ai pris quelques exemples types de ces fonctions, ayant des caractéristiques différents pour illustrer le comportement. Elles sont toutes en pièces jointe de ce billet pour des questions de lisibilité.

  • Split
    • La fonction .Net
  • Split2
    • Traitement de chaîne par fonctions native SQL
  • Split3
    • Utilise la méthode Nodes() du type XML
  • Split4
    • Traitement de chaîne par fonctions native SQL
  • Split5
    • Algorithme utilisant une CTE recursive, attention il ne fonctionnera pas au-dessus de 32767 éléments à renvoyer

Chacune d'entre elle prend comme argument des chaînes Unicode (nvarchar), pas de limites sur la longueur en entrée. On va cependant réaliser les tests sur une chaîne de caractère courte (4000 caractères).

Le banc de test :

set statistics io on
set
statistics time on

SELECT *
FROM
dbo.Split5(REPLICATE(N'A ', 2000), ' ')

OPTION(MAXRECURSION 32000) ;

SELECT *
FROM
dbo.Split4(REPLICATE(N'A ', 2000), ' ') ;

SELECT *
FROM
dbo.Split3(REPLICATE(N'A ', 2000), ' ') ;

SELECT *
FROM
dbo.Split2(REPLICATE(N'A ', 2000), ' ') ;

SELECT *
FROM
dbo.Split(REPLICATE(N'A ', 2000), ' ') ;

set statistics time off
set
statistics io off

Et le tableau récapitulatif :

 

Split

Split2

Split3

Split4

Split5

Temps CPU

30 - 70 ms

150 – 160 ms

> 4 sec

150 - 160 ms

30 - 70 ms

Nbre I/O

0

4

4

5

> 12000

Les temps processeur étant assez volatile je me suis permis de mettre une fourchette, avec les valeurs que l'on retrouve habituellement lors de ces exécutions.

En termes de temps processeur pur, la fonction .Net est au coude à coude avec Split5 à base de CTE récursive. Cependant le facteur des entrées / sorties (I/O) est aussi à prendre en compte et les 12000 I/O sont très très pénalisante au jour le jour. Je ne parle pas de la limitation intrinsèque du nombre maximale d'itération de cette dernière.

Deuxième test :

Cette fois ci je limite le nombre de lignes renvoyés en rallongeant les fragments qui composent ma chaîne principale.

SELECT *
FROM
dbo.SplitX(REPLICATE(N'AAA ', 500), ' ') ;

Résulats :

 

Split

Split2

Split3

Split4

Split5

Temps CPU

~ 30 ms

~ 30 ms

~ 250 ms

~ 30 ms

~ 15 ms

Nbre I/O

0

2

2

2

~ 3000

Dans cette situation la méthode récursive est clairement la plus rapide, mais toujours au détriment des I/O

Sur une exécution simple, le résultat est sans appel pour cette liste de fonction, le code.Net l'emporte haut la main en termes de performances.

Par contre si je change mon exemple et que je mets une liste de chaîne dans une table de test, et que j'exécute une requête du type :

SELECT *
FROM Table1
    CROSS APPLY Split(col, ' ')

Le résultat se dégrade fortement pour la variante .net face à ses concurrentes en T-SQL. C'est sans doute lié à la différence de comportement des TVF (fonctions de type table) .Net face à leur équivalent SQL. La première renvoie le résultat au fur et à mesure, tandis que le second peuple un espace temporaire avant de renvoyer le résultat.

Mais pourquoi dans exemple précédent le code SQL est plus lent ? Généralement parce que le traitement de chaîne force le moteur à utiliser beaucoup d'allocation de mémoire et dans les pire des cas de l'espace dans tempdb. A l'opposé .Net est optimisé pour ces opérations-là, qui se font uniquement en mémoire et nécessite moins d'allocations.

Comme je l'évoquais ces tests sont nullement exhaustif, il reflète un exemple où .Net peut être globalement plus efficace que le T-SQL. J'essaierais de fournir des exemples contraires par la suite.

Bons tests…

Posté le par christian | 1 commentaire(s)
Attachment(s): SplitAll.zip

SQL Server : Passer plus de 4000 caractères à une fonction .Net (SQLCLR)

Dans l'exemple d'hier (Split de chaîne : http://blogs.codes-sources.com/christian/archive/2009/12/17/sql-server-cr-er-une-fonction-de-type-table-tvf-via-net-sqlclr-exemple-d-un-split-de-cha-ne.aspx) de ma fonction de type table écrite en C# et intégré dans le moteur de bases de données, vous aurez peut être remarqué que le premier argument de la fonction n'était qu'un nvarchar(4000).

Pour le nvarchar on ne peut rien changer, les paramètres de fonctions sont exclusivement Unicode, au moins il n'y a pas à jongler entre les pages de code. Par contre il est possible de jouer sur la taille des arguments, bien que cela ne soit à nouveau pas très documenté.

Reprenons la fonction appelée et ses paramètres.

public static IEnumerable Split(

SqlString input,
SqlString separator

)

On va tout d'abord limiter la taille du paramètre « separator », mettons à 10 caractères :

public static IEnumerable Split(

SqlString input,
[SqlFacet(MaxSize = 10)] SqlString separator

)

Pour cela on a ajouté un attribut devant ce paramètre (pour moi c'était une découverte que cette possibilité de mettre un attribut à cet endroit… Bon je ne suis pas développeur mais quand même). Son nom : SqlFacet qui permet de jouer sur les caractéristiques des types passés du ou vers le moteur : taille, précision, longueur, etc.

Pour le nvarchar(max), c'est aussi simple, au lieu de la valeur 10, la convention est de mettre -1 pour signaler que l'on peut utiliser la valeur maximale permise par le moteur (qui est pour le moment de 2Go de taille stockée pour les types caractères).

public static IEnumerable Split(

[SqlFacet(MaxSize = -1)] SqlString input,
[SqlFacet(MaxSize = 10)] SqlString separator

)

On recompile, on déploie et le tour est joué vous pourrez passer autant de caractères que souhaité !

Bonne longueur…

Posté le par christian | 0 commentaire(s)
Classé sous : ,
Plus de Messages Page suivante »


Les 10 derniers blogs postés

- TechDays Paris 2010 : Plan de migration vers SharePoint 2010 par Blog Technique de Romelard Fabrice le il y a 3 heures et 34 minutes

- TechDays Paris 2010 : La pleinière du second jour par Blog Technique de Romelard Fabrice le il y a 4 heures et 39 minutes

- Visual Studio 2010 and .NET Framework 4 Release Candidate now available par Matthieu MEZIL le il y a 7 heures et 45 minutes

- Création d’une base de donnée sous SQL Azure par Le Blog (Vert) d'Arnaud JUND le il y a 8 heures et 42 minutes

- TechDays Paris 2010 : Les Services d’applications dans SharePoint 2010 par Blog Technique de Romelard Fabrice le il y a 18 heures et 41 minutes

- TechDays Paris 2010 : La GED et SharePoint 2010 par Blog Technique de Romelard Fabrice le il y a 22 heures et 39 minutes

- TechDays Paris 2010 : SharePoint 2010 et Les réseaux sociaux par Blog Technique de Romelard Fabrice le il y a 23 heures et 53 minutes

- TechDays Paris 2010 : SharePoint 2010 – Description et nouveautés par Blog Technique de Romelard Fabrice le 02-08-2010, 14:33

- TechDays Paris 2010 : Pleinière Lundi par Blog Technique de Romelard Fabrice le 02-08-2010, 14:30

- [Techdays 2010] #02 - Nouveautés de SharePoint 2010 par Le petit blog de Pierre / Pierre's little blog le 02-08-2010, 13:52