Business Geek

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

Tag - SQL Server 2008

Fil des billets - Fil des commentaires

dimanche 28 septembre 2008

MS Days à Toulouse

Encore un nouvel événement Microsoft me direz-vous... Et bien oui et on ne s'en lasse pas, même si c'est événement n'est autre que le Microsoft Technet Tour de la fin d'année.

Au menu, des sessions et des échanges avec les speakers Microsoft sur les dernières technologies Microsoft : SQL Server 2008, Hyper-V, Visual Studio 2008, le Framework .NET 3.5, etc.

Le session sur la Business Intelligence avec SQL Server 2008 et Performance Point sera animée par votre serviteur. Je vous invite aussi à aller voir la session de Patrick Guimonet de Microsoft sur SQL Server 2008 dont le lancement en version finale a eu lieu pendant les vacances.

L'événement est gratuit et a lieu ces lundi et mardi (oui, le post arrive au dernier moment). Il vous reste donc quelques heures pour valider votre inscription et venir découvrir ou poser des questions sur les solutions Microsoft.

 

samedi 30 août 2008

Transactions - REPEATABLE READ

Voici le problème que je vais traiter : je veux pouvoir m'assurer dans une transaction qu'un jeu d'enregistrements ne sera pas touché pendant que j'opère une série de modifications. Par exemple, je ne veux pas qu'on puisse modifier une série d'adresses pendant que je mets à jour le contact qui les possède. Pour être plus concret, je veux bloquer les adresses 31 et 52 pendant que je modifie le contact John Smith. Par exemple :

BEGIN TRAN

SELECT * INTO #TempTable FROM Person.Address Where AddressID in (31,52)

UPDATE Person.Person Set Title = 'Lord' Where LastName = 'Smith' and FirstName = 'John'
UPDATE Person.PersonPhone Set [...]

Par défaut, le niveau d'isolation de transaction de SQL Server est READ COMMITED. En d'autres termes, cela signifie que l'on ne peut lire ou modifier que des données qui ont validées (comitées pour reprendre le barbarisme franglais). Selon le moteur de transactions, les adresses peuvent être modifiées pendant que ma transaction a lieu.

Techniquement, dans le moteur SQL, cela se traduit par des locks partagés (Shared) sur la table Address qui durent le temps du premier SELECT et des locks exclusifs (eXclusive) sur les tables modifiées. Une fois le SELECT passé, les locks Shared sont libérés, laissant la place pour des modifications. En revanche les locks exclusifs sont maintenus jusqu'au COMMIT (ou ROLLBACK), empêchant les modifications. On peut le vérifier en regardant les verrous sur les tables en question :

SET TRANSACTION ISOLATION LEVEL READ COMMITTED --mode par défaut

BEGIN TRAN

SELECT *
FROM Person.Address
WHERE AddressID IN (31,52)

select resource_type, resource_description, request_mode, request_type
from sys.dm_tran_locks

ROLLBACK

 

 

Lors de la consultation des locks, il n'y en a aucun donc une instruction parallèle peut modifier les adresses. Nous allons donc utiliser un autre niveau de transaction pour changer le comportement du moteur.

En choisissant le niveau juste au dessus, REPEATABLE READ, le moteur va poser des locks Shared et les maintenir le temps de la transaction. C'est ce que l'on appelle des lectures répétables. Pour modifier un enregistrement, le moteur doit poser un lock exclusif et donc doit attendre de n'avoir plus de locks Shared. Voyons le comportement des verrous, pour cela, il suffit de changer le niveau d'isolation dans la première ligne : 

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ

BEGIN TRAN

SELECT *
FROM Person.Address
WHERE AddressID IN (31,52)

select resource_type, resource_description, request_mode, request_type
from sys.dm_tran_locks

ROLLBACK

 

 

On voit bien que des locks Shared (S et IS) sont maintenus après le SELECT. Ceci garantie que ces enregistrements ne seront pas modifiés le temps de ma transaction. De plus, du fait que ce soit des locks Shared, une autre transaction peut lire ces enregistrements.

 

Bien évidemment, la gestion des locks est très fine dans SQL Server et se complexifie avec l'ensemble des requêtes à un instant T. SQL Server va tenter de verrouiller le niveau le plus fin et le moins contraignant pour respecter vos niveaux d'isolation et garantir la transactionalité. Et tout ceci se combine avec les différents objets liés à la table (index, allocations, etc.).

 

Vous aurez noté au passage l'utilisation de la vue système sys.dm_tran_locks qui remplace depuis 2005 l'ancien sp_lock et qui vous aidera à comprendre le fonctionnement du moteur transactionnel et à minimiser la contention sur vos bases.

Bonne optimisation...

jeudi 28 août 2008

Agrégat CLR – Nouveauté 2008

En ce moment, je teste pas mal SQL Server 2008 et en particulier les améliorations par rapport à la version précédente. Aujourd’hui, je me suis intéressé aux fonctionnalités de la SQLCLR et j’ai voulu savoir si une des limitations de 2005 était levée.

Le problème était le suivant (le fait que je parle à l’imparfait devrait vous aiguiller sur la réponse) : dans une fonction d’agrégat CLR, il n’était possible de fournir qu’un seul paramètre à la méthode Accumulate. Ceci était pénalisant pour certaines fonctions à double entrée ou pour paramétrer le comportement d’autre.

Par exemple, sur une fonction de concaténation (très utile dans les reports), il était impossible de préciser le caractère à utiliser comme séparateur. Cela a entraîné (chez nous en tout cas) de grands débats sur le choix caractère à utiliser dans le code .NET. Cela impliquait aussi l’utilisation de méthodes de Replace dans les couches supérieures pour traiter le caractère.

Venons-en à la solution que propose SQL Server 2008 maintenant.  Je suis en fait tombé sur la documentation suivante :

CREATE AGGREGATE [ schema_name . ] aggregate_name
        (@param_name <input_sqltype> 
        [ ,...n ] )

J’ai été intrigué et admiratif sur le ..n dans la liste de paramètres qui suppose que les fonctions d’agrégat de 2008 supportent le multi-paramètre.
Je me suis empressé de modifier quelque peu l’agrégat de concaténation des exemples de SQL Server et j’ai modifié la méthode Accumulate de cette façon :

[Microsoft.SqlServer.Server.SqlUserDefinedAggregate(…)]
public struct Concat {
    […]
    public void Accumulate(SqlString Value, SqlString separator)
    {
        if (!isFirst)
            sb.Append(separator);
        else
            isFirst = false;
        sb.Append(Value.Value);
    }

Après avoir intégré l’Assembly dans ma base, je mappe la fonction d’agrégat :

CREATE AGGREGATE [dbo].[Concat] (
  @value [nvarchar](4000),
  @separator [nvarchar](10))
RETURNS[nvarchar](4000)
EXTERNAL NAME [BewiseUtils].[Bewise.SqlServer.Concat]

Et le test final :

SELECT dbo.Concat(LastName, ', ')
FROM Person.Person

Et voila le travail… Chacun peu choisir son séparateur dans la fonction de concaténation.

mardi 1 avril 2008

Cadeau à la BDC 2008 !!!!

Je ne présente plus la Bewise Developer Conference 2008 organisée par Bewise à Toulouse le 10 avril. Par contre, cette nouvelle va en ravir plus d'un.

Pour toute inscription et présence aux sessions SQL Server de la BDC, une licence Enterprise Edition sera offert.

Inscrivez-vous vite, il ne reste plus que quelques jours !!!

 

POISSON D'AVRIL

PS : désolé de gacher si vite la surprise pour les gens qui ont un reader RSS texte, qui ne prends pas en compte le subterfuge :-)

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

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.

mardi 26 février 2008

SQL Sever 2008 : Change Data Capture

Je viens d'écrire un article sur une des fonctionnalités de SQL Server 2008 : le Change Data Capture (ou CDC). Je l'avais commencé avec la CTP2 (ça date). Il est maintenant terminé. Cet article dresse un portrait assez complet de la fonctionnalité et propose un petit tutoriel de mise en oeuvre.

Vous pouvez le consulter sur le site de Bewise: http://www.bewise.fr/SiteCollectionDocuments/Articles/article-57.doc 
Le code source est disponible ici.

Prochaine étape : l'utilisation dans un cas concret d'ETL avec SSIS.

Voici un petit aperçu en ligne :

Introduction

Le Change Data Capture (que nous appellerons CDC) est une nouvelle fonctionnalité de SQL Server 2008. Apparu dès la CTP2, Cet article se base sur la CTP5 et il n’est pas exclu qu’il y ait des modifications dans les versions suivantes.

Le CDC a une orientation initiale pour les processus d’ETL. L’objectif de CDC est d’optimiser l’intégration des données  en requêtant directement les modifications faites sur les bases de productions, plutôt que de comparer la source et la destination.

Bien entendu, on peut étendre l’utilisation du CDC à de la synchronisation entre 2 bases, à de l’audit ou à tout autre besoin nécessitant de connaître ce qu’il se passe sur une table.

Les exemples de cet article se basent sur AdventureWorks. Nous utiliserons la table des commandes SalesOrderHeader.

Principes de fonctionnement

Le CDC capture les modifications qui se font sur les tables. On choisit les tables sur lesquelles on souhaite faire la capture, toutes les modifications ne sont évidemment pas monitorées. On peut même restreindre la capture à quelques colonnes d’une table.

Le CDC est un processus asynchrone. Il fonctionne comme la réplication transactionnelle à savoir qu’un « agent » lit le journal de transaction (transaction log) et met de côté les modifications dans des tables spécifiques.

C’est la (ou les) applications « clients » qui viennent chercher les modifications. La récupération des modifications se fait sur demande en mode pull.

jeudi 21 février 2008

SQL Server 2008 CTP6

La dernière CTP de SQL Server 2008 est enfin disponible en téléchargement. Au programme :

  • iFTS (Integrated Full-Text Search)
  • Compression
  • Filtres sur les index (oh oui)
  • Audit
  • Type SPARSE

 

Le lien est le suivant : x86
Pour les ISO ou autres versions je vous invite à consulter le site de Microsoft.

Enfin, je vais pouvoir jouer avec l'iFTS que j'ai présenté lors de ma session aux TechDays (d'ailleurs, j'ai un post en cours pour présenter ma session de façon epistolaire).

vendredi 15 février 2008

Compatibilité Management Studio 2008 et SQL Server 2005

J'en avais assez de travailler sur SQL Server 2008 sur une VPC alors j'ai sauté le pas en essayant de l'installer sur mon Vista classique. Pour une raison que j'ignore, la première installation s'est mal passée dans le sens ou il était impossible d'xécuter une requête sur aucune des instances (2005 & 2008).

Je tente un tout bête uninstall / install et miracle, tout marche bien. Les 2 versions cohabitent super bien et l'effet que j'attendais :

J'ai l'intellisense sous SQL Server 2005 grâce à Management Studio 2008 qui arrive à travailler avec une base de données de version inférieure.

Je n'ai évidemment pas tout testé : Full-Text, Broker, connexion IP, etc. mais je vous remonterais les problèmes si j'en rencontre.

A noter que je n'ai rien installé des outils de Business Intelligence (je suis sur un projet et je ne veux rien casser), je vais faire des essais et je reviendrai dessus dans un prochain post.

 

- page 1 de 2