Avec la //Build/ une nouvelle version des Tools pour Windows Azure et sorti, avec son lot de nouveauté non négligeable ! Et donc une que j’attends depuis le premier jour où j’ai fait de l’Azure, lors d’un Azure Camp by ZeCloud d’ailleurs. Cette nouveauté est donc le support de la projection dans le Select avec Windows Azure. En effet, avant avec Windows Azure pour récupérer uniquement quelques champs d’une Table dans le Table Storage Azure, il fallait récupérer tous les entités que l’ont souhaité et ensuite faire notre projection sur une liste d’objet. Cela nous donnait à peu près le code suivant :
var query = from n in serviceContext.TestDatas
select n;
var result = query.AsEnumerable().Select(n => n.Name);
Le principal problème c’est qu’Azure devait sérialiser entièrement nos “TestDatas” pour les retourner, alors qu’un support du Select en mode natif serait magique, et bien maintenant c’est le cas ! Il est donc directement possible de faire cela :
var storageAccount =
CloudStorageAccount.FromConfigurationSetting(
"Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString");
var serviceContext = new AzureServiceContext(storageAccount);
var query = from n in serviceContext.TestDatas
select n.Name;
L’avantage donc, c’est que l’API Azure ne va sérialiser que les noms Name. Alors j’ai réalisé un petit bout de code en ASP.Net MVC pour voir si les performances était probante des deux côtés. Mon cas de test : - Environnement sous Visual Studio 2010, Windows Azure SDK 1.5, Windows 8 Preview Developer x64 - 10 000 enregistrements de la classe TestDatas sur un Azure Pass avec le storage au niveau de Dublin La classe TestDatas
public class TestData : TableServiceEntity {
public string Name { get; set; }
public DateTime DateInsert { get; set; }
}
Les méthodes de tests avec la projection et sans celle ci :
public ActionResult ListWithoutSelect()
{
Stopwatch watch = new Stopwatch();
watch.Start();
var storageAccount =
CloudStorageAccount.FromConfigurationSetting(
"Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString");
var serviceContext = new AzureServiceContext(storageAccount);
var query = from n in serviceContext.TestDatas
select n;
watch.Stop();
return View(
new TestResult()
{
ElapsedTime = watch.ElapsedMilliseconds
});
}
public ActionResult ListWithSelect()
{
Stopwatch watch = new Stopwatch();
watch.Start();
var storageAccount =
CloudStorageAccount.FromConfigurationSetting(
"Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString");
var serviceContext = new AzureServiceContext(storageAccount);
var query = from n in serviceContext.TestDatas
select n.Name;
watch.Stop();
return View(new TestResult()
{
ElapsedTime = watch.ElapsedMilliseconds
});
}
Voici mon tableau de quelques résultats en millisecondes, j’ai relancé la solution en mode debug avant chaque résultat.
Sans projection
3590
3020
4771
5145
2057
Avec projection
2089
2189
3060
2321
2496
Il faut savoir que le deuxième appel est beaucoup plus rapide (environ 150ms), grâce à un cache. On peut donc voir qu’avec la projection, c’est relativement plus rapide. Cependant notre classe TestDatas ne contient que 2 champs …. Attention il n’est actuellement pas possible d’effectuer une requête select avec de la projection afin de traiter le contenu ultérieurement. Sauf une projection sur les PrimaryKey et RowKey. Je ne fournis pas le code, je suppose que vous pourrez le refaire !
Comments
Post comment