Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Reactive Extensions Partie 2 : IScheduler

En décembre dernier, un nouveau concept a été introduit dans les Reactive Extensions. Ce concept est représenté par la nouvelle interface IScheduler.

Une des problématiques récurrentes avec la programmation asynchrone est le fait que certain code ne puisse s'executer que sur certains threads. Par exemple, avec WinForms ou Silverlight, seul le thread de l'UI peut mettre à jour l'UI. Si vous essayez de changer la couleur d'un Label depuis un thread du thread pool, vous obtiendrez une exception.

Dans un premier temps, les Reactive Extensions on résolues ce problème en utilisant un context global, représenté par une variable statique. Lorsque vous utilisiez une méthode du type Interval, les callbacks (appels a OnNext, OnError et OnCompleted) étaient appelés en utilisant un thread lié au context global. Cette approche n'est cependant pas très élégante, souvent peu pratique, et surtout peu composable.

Une des caractèristiques clés de Rx étant la composabilité, les créateurs de Rx ont complètement replacé cette approche dans une des dernières releases de la librairie.

La création de concurrence passe maintenant par des schedulers, implémentant l'interface IScheduler. Voici a quoi elle ressemble :

public interface IScheduler
{
    IDisposable Schedule(Action action);
    IDisposable Schedule(Action action, TimeSpan dueTime);
}

IScheduler represente un mechanisme pouvant executer du code. Il est possible de plannifier l'execution de code après un certain délai (méthode prenant un argument TimeSpan), ou bien de plannifier l'execution de code "dès que possible" (sans garantie qu'il s'execute immédiatement).

Dans Rx, on peut distinguer deux types d'opérateurs :

  • Ceux qui relaient un callback, comme Select et Where. Ils observent la source, et lorsqu'une notification arrive, ils en produisent une autre sur le même thread. De la même façcon, Merge ou ForkJoin utilisent le thread d'une des sources pour produire une notification.
    FromEvent est dans la même catégorie parcequ'il utilise le thread sur lequel l'évènement est levé pour produire la notification. Ce thread peut venir de l'UI dans le cas de Button.Click, ou du thread pool dans le cas de WebClient.DownloadStringCompleted, ou d'autres sources encore selon l'implémentation. L'opérateur FromEvent réutilise ce thread et n'en crée pas d'autre.
    Ces opérateurs ne créent donc pas de concurrence, ils réutilisent les threads qui leur envoie la notification.
  • D'autres opérateurs créent de la concurrence : Timer et Interval en sont des exemples. Return en est aussi un, même si la notification est censée arriver instantanément.

Tous les opérateurs créant de la concurrence prennent un IScheduler en paramètre, indiquant comment cette concurrence doit être créée.

Dans sa version actuelle, Rx fournit trois schedulers par défaut : Scheduler.Now, Scheduler.Later, et Scheduler.Dispatcher.

  • Scheduler.Later crée de la concurrence en prenant un thread dans le thread pool. Dans .NET 4.0, il est implémenté en utilisant la TPL. La méthode Schedule(Action, TimeSpan) est implémentée en utilisant System.Threading.Timer.
  • Scheduler.Now est particulier car il utilise le thread courant. La méthode Schedule(Action, TimeSpan) est donc implémentée en utilisant Thread.Sleep.
  • Scheduler.Dispatcher permet de garantir que les threads utilisés sont compatibles avec le dispatcher en cours. Cela permet de mettre à jour l'UI depuis le thread produisant la notification.

Scheduler.Default pointe sur Scheduler.Later, sauf sur Silverlight ou il pointe sur Scheduler.Dispatcher.

Pour bien comprendre le fonctionnement des schedulers, il faut étudier quelques exemples. Utilisons Interval avec Scheduler.Later :

IScheduler scheduler = Scheduler.Later;

IObservable<long> interval = Observable.Interval(scheduler, TimeSpan.FromSeconds(1));
Console.WriteLine("Start Subscribe");
interval.Subscribe(
Console.WriteLine);
Console.WriteLine("End Subscribe");

Le resultat sur la console est le suivant :

Start Subscribe
End Subscribe
0
1
2
...

Par contre, si on utilise Scheduler.Now a la place, on obtient :

Start Subscribe
0
1
2
...

Donc dans le cas de Scheduler.Later, l'appel a Subscribe plannifie les notifications en utilisant le thread pool, Subscribe n'est donc pas bloquant.

Au contraire, avec Scheduler.Now, les notifications sont plannifiées sur le thread en cours. Le thread est en someil pendant une seconde entre chaque notification. Subscribe est donc bloquant dans ce cas, et "End Subscribe" n'est jamais atteint.

Nous verrons dans une prochaine partie comment implémenter un opérateur en utilisant un scheduler.

Reactive Extensions Partie 1 : Introduction

Me revoila après quelques mois sans poster sur ce blog. Vous l'avez probablement remarqué, la programmation parallèle est en plein essor. Le nombre de coeurs dans nos processeurs ne cesse d'augmenter, et les jours sont maintenant comptés avant qu'on ait des processeurs quadricores jusqu'à dans nos téléphones. Il est donc nécessaire pour les développeurs d'adapter la façon même de concevoir et écrire des logiciels.

Microsoft n'est pas insensible à cette problématique et a déjà fait un grand pas avec le Parallel FX, qui sera partie intégrante du .NET Framework 4.0. La TPL en particulier permet d'écrire des programmes parallèles beaucoup plus confortablement que ça n'était le cas avec .NET 3.5. Mais même si il s'agit d'une avancée serieuse, il manquait toujours quelque chose pour unifier tous les differents modèles de programmation asynchrone, et surtout pour les orchestrer et les coordinner.

C'est pour cette raison que les Reactive Extensions (aussi appelées RX) ont vu le jour. Il s'agit d'une librairie sortie de DevLabs. Elle fonctionne avec .NET 3.5, .NET 4.0 et Silverlight 3. Cette librairie est construite autour de deux interfaces clés : IObservable<T> et IObserver<T>. Ces deux interfaces seront intégrées dans .NET 4.0.

IObservable est en fait très similaire à IEnumerable, elle représente une collection. Mais là où IEnumerable représente une collection synchrone ("Pull"), où le consommateur choisit quand il veut la prochaine valeur (MoveNext / Current), IObservable représente une collection asynchrone. L'IObservable décide quand une nouvelle valeur est disponible, et la fournit au consommateur ("Push").

IObservable et IObserver

public interface IObservable<T>
{
    IDisposable Subscribe(IObserver<T> observer);
}

public interface IObserver<in T>
{
    void OnCompleted();
    void OnError(Exception error);
    void OnNext(T value);
}

IObservable fonctionne de la manière suivante :

  • Le consommateur dispose d'une instance d'un objet qui implémente IObservable (collection asynchrone)
  • Le consommateur appelle la méthode Subscribe en passant un IObserver (qui peut être assimilé à un "super-callback")
  • Lorsque la collection décide qu'une nouvelle valeur est disponible, elle appelle la méthode OnNext de l'IObserver en passant la valeur en paramètre (ceci se produit pour chaque valeur dans la collection)
  • Lorsque la collection a été complètement énumerée avec succès, elle appelle la méthode OnComplete de l'IObserver, ou, si une erreur s'est produite, elle appelle la méthode OnError de l'IObserver en passant les détails de l'exception

Cela semble surement très abstrait, voici donc un exemple :

Commençons par implémenter un IObserver :

public class ConsoleObserver : IObserver<string>
{
    public void OnCompleted()
    {
        Console.WriteLine("OnCompleted");
    }

    public void OnError(Exception error)
    {
        Console.WriteLine("OnError");
    }

    public void OnNext(string value)
    {
        Console.WriteLine("OnNext: " + value);
    }
}

Cet observeur affiche les valeurs qu'il reçoit dans la console.

Créons maintenant un IObservable. Il y a des centaines de façons différentes de créer des IObservables en utilisant RX. Voici l'une d'elles :

IObservable<string> observable = Observable.Return("Hello");

Cette ligne crée un observable qui génère instantanément la valeur "Hello", puis termine (OnCompleted).

Souscrivons maintenant à cet observable en utilisant notre ConsoleObserver:

IObserver<string> observer = new ConsoleObserver();
observable.Subscribe(observer);

Voici ce qui s'affiche sur la console :

OnNext: Hello
OnCompleted

Les auteurs de RX ont fait en sorte que toute opération possible sur un IEnumerable existe aussi pour IObservable (si elle a du sens), voici donc un exemple de ce qu'il est possible de faire:

IObservable<string> observable = from value in Observable.Range(0, 100)
                                 select "Hello " + value.ToString();

Cet observable va générer instantanément 100 valeurs puis termine. Il n'y a cependant rien de terriblement asynchrone dans les deux exemples ci-dessus.

IObservable<string> observable = from value in Observable.Interval(TimeSpan.FromSeconds(1))
                                
select "Hello " + value.ToString();

Celui-ci par contre, génère une valeur toutes les secondes, et ne termine jamais.

J'entrerai plus dans les détails sur IObservable et les Reactive Extensions dans mes prochains articles.

Télécharger RX : http://msdn.microsoft.com/en-us/devlabs/ee794896.aspx

Posté le par RaptorXP | 2 commentaire(s)

Chromium : "Some guys head"

Voici un intéressant rapport de bug pour Chromium (qui est la version open source de Chrome) sur lequel je suis tombé recemment: http://code.google.com/p/chromium/issues/detail?id=18385.

Voici un extrait pour le moins intriguant:

What steps will reproduce the problem?
1. Look at what the X button is supposed to be

What is the expected result?
an X button

What happens instead?
Some guys head

Si vous n'êtes pas sur de comprendre, ouvez la capture attachée au bug ci-dessous, elle parle d'elle même :

Bug Chromium

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

Windows 7 à 49 euros : C'est fini

Windows 7J'ai publié hier un message sur l'offre de Windows 7 à 49 euros. L'offre était sensée s'étendre jusqu'au 4 août, cependant, après un peu plus d'une journée de ventes, tout à été vendu, et il n'est maintenant plus possible de bénéficier de cette offre en ligne, que ce soit sur le Microsoft Store ou sur les sites partenaires. Je rappelle que l'offre était en effet limitée à 76 000 unités.

Il reste cependant une option, selon ZDNet, il reste encore des stocks dans quelques magasins physiques.

Pour les chanceux qui ont pu mettre la main sur une boite, il faudra maintenant attendre le 22 octobre pour la recevoir.

Je rappelle qu'une offre de lancement sera également disponible du 22 octobre au 31 décembre 2009, avec Windows 7 Home Premium à 119 euros, et Windows 7 Professional à 285 euros.

Posté le par RaptorXP | 4 commentaire(s)
Classé sous : ,

Windows 7 : Début des précommandes à 49 euros

Windows 7C'est aujourd'hui que débute l'offre spéciale de précommande de Windows 7, qui s'étendra jusqu'au 4 août prochain. Windows 7 sortira officiellement le 22 octobre prochain, et ceux qui auront précommandés une boite la recevront à partir de cette date.

Je rappelle les tarifs pour cette offre de précommande :

  • Windows 7 Home Premium complète (Boite) : 49,99 euros
  • Windows 7 Professional complète (Boite) : 109,99 euros

A partir du 22 octobre, vous pourrez acheter Windows 7 directement en magasin, mais aux prix de 119,99 euros pour l'édition Home Premium et 285 euros pour l'édition Professional.

A noter également que cette offre de précommande est limitée à 3 unités par foyer et 76 000 unités au total.

Voici quelques sites où vous pouvez passer la précommande :

Ces site ont vite été pris d'assaut ce matin, et certains d'entre eux affichaient déjà rupture de stocks. Seul le Microsoft Store, qui était inaccessible depuis ce matin à cause du nombre trop important de commandes, mais qui semble maintenant de nouveau accessible, et la FNAC, qui a ouvert les précommandes après ses concurrents, semblent ne pas être en rupture de stocks.

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

Windows Azure : Prix, SLA et date de disponibilité commerciale

Windows AzureMicrosoft a annoncé au WPC cet après-midi les tarifs qui s'appliqueront à Windows Azure. Beaucoup attendaient cette annonce avant de commencer à développer pour Windows Azure.

Voici les tarifs:

  • Calcul : $0,12 par heure
  • Stockage : $0,15 par Go (par mois)
  • Calcul pour le système de stockage : $0,01 pour 10 000 transactions
  • Bande passante : $0,10 par Go pour les données entrantes, $0,15 par Go pour les données sortantes. Ce tarif s'applique pour tout les services de Windows Azure.

Pour ce qui est de SQL Data Services, il y a deux "packages" possibles :

  • Edition Web (une base de données jusqu'à 1 Go) : $9,99 par mois
  • Edition Business (une base de données jusqu'à 10 Go) : $99,99 par mois

Je rappelle que SQL Data Services fournit une plateforme de base de données relationnelles hébergé dans le cloud. La plupart des fonctionnalités de base de SQL Server devraient être supportées (Vues, Indexes secondaires, Triggers, Contraintes...), et si votre application écrite pour SQL Server n'utilise que ces fonctionnalités de base, vous devriez pouvoir l'adapter pour SQL Services simplement en changeant la connection string.

Pour ce qui est de la SLA de Windows Azure, Microsoft garantit 99,95% si vous déployez au moins deux instances d'un rôle dans des fault domains et upgrade domains différents. Pour ce qui est d'Azure Storage, Microsoft garantit 99,9% de succès pour les transactions.

La date de lancement commerciale sera PDC09 (Novembre).

Le blog officiel, c'est par ici : http://blogs.msdn.com/windowsazure/archive/2009/07/14/confirming-commercial-availability-and-announcing-business-model.aspx.

Posté le par RaptorXP | 0 commentaire(s)

Microsoft Security Essentials en bêta dès demain

Microsoft a récemment mis fin à la commercialisation de Windows Live One Care. Pour remplacer celui-ci, Microsoft devrait prochainement sortir son nouvel antivirus Security Essentials.

La version bêta publique de ce logiciel sera rendue disponible demain.

Security Essentials Security Essentials

Celui-ci sera gratuit, et très léger, il devra en effet fonctionner sur des netbooks. Comme vous le voyez sur les captures ci-dessus, l'interface est très épurée. Il dispose d'un mode protection temps réel, ainsi qu'un scan à la demande, avec différents modes (rapide, complet, personnalisé). Il est également possible de programmer des scans à l'avance. Il protège des virus, spywares, et autres malwares. Security Essentials est compatible Windows XP, Vista et 7.

Pour ceux comme moi qui rechignent à utiliser un antivirus parceque ceux-ci ont tendence à alourdir le PC, cet antivirus est la bienvenue.

Posté le par RaptorXP | 3 commentaire(s)

Une date de sortie officielle pour Windows 7

Windows 7La date de sortie officielle de Windows 7 a été annoncée hier au Computex. Conformément aux rumeurs, la date de disponibilité publique sera bien le 22 octobre 2009. Contrairement à Vista, Windows 7 arrivera bien à temps pour le sapin. La RTM devrait être finalisée pour fin juillet, laissant à peu près 3 mois aux constructeurs pour intégrer Windows 7 à leurs machines.

Rappelons que si vous souhaitez acheter un PC avant octobre, un programme de mise à niveau gratuite sera disponible pour ceux qui achèterons un PC neuf avec Windows Vista avant octobre. Aucune date officielle n'a été donnée pour le début de ce programme, mais des rumeurs évoquent fin Juin.

Source

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

Bing, le nouveau moteur de recherche de Microsoft

C'est aujourd'hui devenu officiel, le nouveau moteur de recherche de Microsoft s'appelle Bing.

Il n'est malheureusement pas encore possible de l'utiliser pour le grand public, cependant, le nom de domaine est devenu actif, et une page est apparue. Bing ne se veut pas un simple moteur de recherche, mais plutôt un moteur de décision. Il possède en effet de nombreuses fonctionnalités qui peuvent vous aider à choisir lorsque vous faites votre shopping en ligne, achetez un billet d'avion, ou encore lorsque vous cherchez un restaurant ou autre.

Pour utiliser Bing (ou plutôt Kumo, son nom de code) depuis plusieurs mois déjà en dogfood, je trouve que celui-ci n'a plus grand chose à voir avec son ancêtre Live.com. Les résultats sont désormais quasiment aussi précis que la concurrence (on trouve même parfois plus rapidement avec Bing qu'avec Google). Autre point très important, surtout pour nous, français, le moteur a été grandement amélioré pour les marchés autres qu'américain. Live.com était en effet utilisable pour rechercher des sites américains, mais assez peu efficace lorsqu'on recherchait des résultats français par exemple.

Enfin, le petit quelque chose qui fait aussi la différence par rapport à Google, même si ça ne sert à rien au final, la page d'accueil de Bing est agréable à regarder :).

Posté le par RaptorXP | 4 commentaire(s)
Classé sous : , , , ,

Windows Vista SP2 et Windows Server 2008 SP2 disponibles

Windowse Server 2008 SP2Conformément à ce qui a été annoncé la semaine dernière, Microsoft vient de mettre en ligne Windows Vista SP2 et Windows Server 2008 SP2. Vous pouvez les télécharger ici :

  • L'ISO (toutes versions) : ici
  • L'executable pour x86 : ici
  • L'executable pour x64 : ici
  • L'executable pour IA-64 (Windows Server 2008) : ici

Le SP2 devrait être proposé par Windows Update le 30 Juin prochain.

Fun : Scottgu présente Web Platform Installer

Microsoft Web Platform Installer est un petit programme qui permet de déployer des applications sur votre serveur web en quelques clicks : Add-ins pour IIS, SQL Server Express, même certaines applications ASP.NET et PHP.

Ceux qui sont familiers avec les keynotes de Scott Guthrie ont probablement remarqué sa vocation cachée d'acteur. En voici un nouvel exemple dans une vidéo, première de la série, pour la promotion de Web Platform Installer :

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

Une session au MIX par Microsoft Ireland

Mix09Si vous êtes intéressés par le développement pour plateformes mobiles, je ne saurais que vous conseiller d'assister au webcast (ou encore mieux, en direct, si vous êtes à Las Vegas) de la session "Improving Mobile Experiences with the Microsoft Mobile Device Browser File" (MIX09-T85M) au MIX ce soir (13h50 PDT). Le speaker, Chris Woods, qui n'est autre que le Program Manager travaillant dans le bureau en face du mien, présentera un projet sur lequel Microsoft Ireland travaille depuis un bon moment déjà.

Il s'agit de détecter l'appareil effectuant la requête à un site web ASP.NET, et de modifier le rendu de la page en fonction des caractéristiques de l'appareil. Un certain nombre de propriétés Microsoft utilisent déjà ce système, et celui-ci est maintenant rendu disponible pour tous les développeurs via CodePlex.

Pour ceux qui sont intéressés, voici la page en question : http://mdbf.codeplex.com/.

Posté le par RaptorXP | 0 commentaire(s)

ASP.NET MVC : Un filtre pour contrôler la compression de la réponse

Une des grandes forces de ASP.NET MVC est son extensibilité. Les action filters sont un de ces points d'extension. Kazi Manzur Rashid a publié un article sur son blog expliquant comment écrire deux ActionFilters qui contrôlent le cache et la compression de la réponse.

Le cache est maintenant supporté d'origine par ASP.NET MVC, mais le filtre pour contôler la compression peut être utile. Le voici :

public class CompressFilter : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        HttpRequestBase request = filterContext.HttpContext.Request;
        string acceptEncoding = request.Headers["Accept-Encoding"];
        if (string.IsNullOrEmpty(acceptEncoding)) return;
        acceptEncoding = acceptEncoding.ToUpperInvariant();
        HttpResponseBase response = filterContext.HttpContext.Response;
        if (acceptEncoding.Contains("GZIP"))
        {
            response.AppendHeader("Content-encoding", "gzip");
            response.Filter = new GZipStream(response.Filter, CompressionMode.Compress);
        }
        else if (acceptEncoding.Contains("DEFLATE"))
        {
            response.AppendHeader("Content-encoding", "deflate");
            response.Filter = new DeflateStream(response.Filter, CompressionMode.Compress);
        }
    }
}

Il suffit ensuite de décorer une action ou un controlleur avec cet attribut, et la réponse sera automatiquement compressée si le client supporte la compression (tous les navigateurs le supportent de nos jours).

Panne mondiale de Gmail

Le succès des produits Google vient en partie d'une grande souplesse dans certains de leurs processes. Cette souplesse leur permet notamment de mettre en production de nouveaux services ou mettre en ligne des mises à jour de services existants très rapidement.

Le revers de la médaille est que cela se fait au détriment de la qualité. Cela n'avait jamais trop porté préjudice a Google auparavant, jusqu'à ces dernières semaines. La première panne, relayée par tous les journaux de la planète, s'est produite sur Google Search il y a quelques semaines. Tous les liens des pages de résultats de Google Search étaient répertoriés comme dangereux, et Google empêchait les utilisateurs de visiter le site en question. Durant 40 minutes, presque tous les sites webs de la planète ont enregistrés des baisses de trafic relativement importantes. La panne était dû apparemment à une erreur humaine, puisqu'un employé a entré l'adresse "/" dans la liste des sites dangereux. L'idée que le site rapportant la grande majorité des revenus à Google soit mis à jour vraisemblablement sans environnement de "stagging" fait froid dans le dos.

Plus récemment (la semaine dernière), j'ai également noté une erreur, beaucoup plus discrète, mais cependant amusante. Chaque recherche effectuée sur Google Search comprenant le mot "ASP" était détectée comme requête automatique pouvant provenir d'un virus ou d'un spyware :

Google censure ASP

Enfin, aujourd'hui, depuis quelques heures, Gmail, un des plus gros services de Google, souffre d'une panne mondiale. Les responsables de Google ne savent pas encore d'où vient la panne, mais ont déclaré que leurs ingénieurs travaillaient dessus.

Gmail panne mondiale

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

Microsoft ouvre ses boutiques

Microsoft StoreAprès la boutique en ligne, Microsoft a annoncé hier ouvrir des boutiques physiques. Microsoft a pour cela recruté David Porter de chez Wal-Mart, qui s'occupera dans un premier temps de sélectionner les emplacements des boutiques, et d'en définir le design.

Les boutiques proposeront de nombreux produits : des logiciels aux jeux de Xbox, en passant par les serveurs domestiques Windows Home Server et les périphériques comme les souris et claviers. Les boutiques proposeront probablement également des PC de différents constructeurs.

Microsoft commencera surement par un petit nombre de boutiques, il n'est donc pas sûr qu'il y en ait en France, même si la France fait partie des quelques pays pouvant accéder à la boutique en ligne.

Cette initiative devrait permettre à Microsoft de se rapprocher de sa clientèle.

Source

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

L'investiture de Barack Obama avec Silverlight

SilverlightLa cérémonie d'investiture de Barack Obama ce soir sera diffusée par le Presidential Inaugural Commitee en utilisant Silverlight. L'évènement sera également abondamment retransmis par les chaînes de télévision, ainsi que sur Youtube, Twitter et Flickr.

La cérémonie a lieu ce soir à 17h45, heure de Paris.

Silverlight poursuit donc la lente course aux parts de marché. Je rappelle que Scott Guthrie avait annoncé en Novembre dernier qu'un ordinateur sur 4 sur internet était déjà équipé de Silverlight.

Posté le par RaptorXP | 0 commentaire(s)

Fun : Le nouveau MacBook Wheel

Voici une petite vidéo assez marrante produite par le site theonion.com. Steve Jobs (qui a d'ailleurs décidé hier de quitter temporairement Apple pour raisons médicales), annonce le nouveau produit branché d'Apple : le MacBook Wheel.


Apple Introduces Revolutionary New Laptop With No Keyboard

Posté le par RaptorXP | 8 commentaire(s)
Classé sous :

Question SQL Server pour les experts

Voici une question qui m'a intrigué au moment où je rédigeais mes articles sur SQL Server. J'ai posé la question sur le forum MSDN, mais je n'ai pas obtenu de réponse satisfaisante, je profite donc des experts SQL Server du réseau codes-sources pour peut être avoir une réponse à cette question.

Créons d'abord une table :

CREATE TABLE dbo.Persons
    (
    Id int NOT NULL IDENTITY (1, 1),
    FirstName varchar(50) NOT NULL,
    LastName varchar(50) NOT NULL
    )  ON [PRIMARY]
GO
ALTER TABLE dbo.Persons ADD CONSTRAINT
    PK_Persons PRIMARY KEY CLUSTERED (Id) ON [PRIMARY]
GO

Insérons ensuite 5000 enregistrements :

INSERT INTO [dbo].[Persons] (FirstName, LastName) VALUES ('First name', 'Last name')
GO 5000

Consultons ensuite les DMV pour connaître le nombre de pages dans le clustered index :

SELECT * FROM sys.dm_db_index_physical_stats (db_id(), object_id('dbo.MyTable'), null, null, 'DETAILED')

Le résultat dans mon cas est le suivant :

index_type_desc index_depth index_level page_count record_count
CLUSTERED INDEX
2
0
24
5000
CLUSTERED INDEX
2
1
1
24

Nous avons donc un clustered index à deux niveaux. Le niveau racine a bien entendu une page, et 24 entrées correspondantes chacune à une page du niveau suivant, puisque le second niveau a 24 pages.

Exécutons ensuite la requête suivante avec les statistiques IO activées :

SELECT * FROM [dbo].[Persons]

Les statistiques indiquent :

Table 'Persons'. Scan count 1, logical reads 26, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

Un scan est normalement effectué de la façon suivante : la page racine va être lue de façon à localiser la première page du niveau terminal de l'index, puis toutes les pages sont scannées dans l'ordre. On devrait donc avoir un logical read pour la racine, puis 24 pour le niveau terminal, donc 25 reads au total.

Avec la requête suivante :

SELECT TOP(50) * FROM [dbo].[Persons]

Seulement 2 pages sont lues (la racine, puis la première page du niveau terminal) :

Table 'Persons'. Scan count 1, logical reads 2, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

J'obtiens donc ce que j'attendais.

Ma question est donc : pourquoi est-ce que dans le premier cas, on observe un 26e read ?

Posté le par RaptorXP | 4 commentaire(s)
Classé sous : ,

3 articles sur SQL Server (Data Structures, Scans and seeks, Data access strategies)

SQL Server 2008En tant que développeurs (non spécialisés en SQL), nous avons souvent, malgré tout, à utiliser SQL, sans toutefois comprendre comment cela fonctionne vraiment. Diagnostiquer les problèmes de performance qui peuvent survenir avec SQL Server, lire un plan d'exécution, ou encore savoir quel index créer sont des sciences à part entière.

Je profite donc d'une formation donnée par Kimberley Tripp que j'ai suivie le mois dernier sur SQL Server pour partager un peu ce que j'ai pu apprendre. Il s'agit d'une série de 3 articles surtout orientée sur les bases de la lecture de plans d'exécution (les deux premiers articles permettent de comprendre le 3e). Sans connaissances poussées, il est en effet souvent assez difficile de savoir pourquoi une certaine requête est lente, même avec le plan d'exécution sous les yeux, et surtout que faire pour la rendre plus rapide.

Les artiles sont rédigés en Anglais.

- Partie 1 : SQL Server Data Structures

- Partie 2 : SQL Server: Scans and seeks

- Partie 3 : SQL Server: Data access strategies

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

Amazon lance son offre cloud computing pour Windows

AWSAfin de répondre à Windows Azure, Amazon avait annoncé il y a un mois une version de EC2 fonctionnant avec Windows Server et SQL Server. Je viens aujourd'hui de recevoir un mail annonçant le lancement de la version bêta de cette offre.

Les tarifs par instance fonctionnant avec Windows Server sont les suivants:

Instance Type
Windows
Windows with Authentication Services
Standard Small (Default)
$0.125 per hour
$0.25 per hour
Standard Large
$0.50 per hour
$0.75 per hour
Standard Extra Large
$1.00 per hour
$1.50 per hour
High CPU Medium
$0.30 per hour
$0.50 per hour
High CPU Extra Large
$1.20 per hour
$2.00 per hour

Pour ce qui est des instances fonctionnant avec Windows Server et SQL Server Standard, les tarifs sont les suivants:

Instance Type
Windows
Windows with Authentication Services
Standard Large
$1.10 per hour
$1.35 per hour
Standard Extra Large
$2.20 per hour
$2.70 per hour
High CPU Extra Large
$2.40 per hour
$3.20 per hour

Une instance Windows Server est bien entendu suffisante si vous n'avez besoin que de SQL Server Express.

L'instance "Standard Small" se trouve donc 25% plus chère avec Windows qu'avec Linux ou Unix. Attendons maintenant de voir les tarifs que propose Microsoft pour Windows Azure (Microsoft avait annoncé lors du PDC que ceux-ci seraient "compétitifs").

Amazon fournit un SDK (C#, .NET 2.0) pour permettre à votre application de s'exécuter dans le contexte de EC2. Pour s'inscrire pour la bêta: http://aws.amazon.com/windows/.

Plus de Messages Page suivante »


Les 10 derniers blogs postés

- TechDays Paris 2010 : Déploiement de nouvelles technologies – Retour d’expérience par l’informatique de Microsoft par Blog Technique de Romelard Fabrice le il y a 30 minutes

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

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

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

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

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

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

- TechDays Paris 2010 : SharePoint 2010 et Les réseaux sociaux par Blog Technique de Romelard Fabrice le 02-08-2010, 15:40

- 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