Check-list des performances et de la scalabilité pour le stockage TablePerformance and scalability checklist for Table storage

Microsoft a mis au point un certain nombre de pratiques qui ont fait leurs preuves pour le développement d’applications hautes performances avec le stockage Table.Microsoft has developed a number of proven practices for developing high-performance applications with Table storage. Cette check-list fournit des pratiques clés que les développeurs peuvent utiliser pour optimiser les performances.This checklist identifies key practices that developers can follow to optimize performance. Gardez ces pratiques à l’esprit lorsque vous concevez votre application et tout au long du processus de développement.Keep these practices in mind while you are designing your application and throughout the process.

Le stockage Azure a des objectifs de scalabilité et de performances pour la capacité, le taux de transactions et la bande passante.Azure Storage has scalability and performance targets for capacity, transaction rate, and bandwidth. Pour plus d’informations sur les cibles de scalabilité de Stockage Azure, consultez Cibles de scalabilité et de performances pour les comptes de stockage standard et Cibles de scalabilité et de performances pour le stockage Table.For more information about Azure Storage scalability targets, see Scalability and performance targets for standard storage accounts and Scalability and performance targets for Table storage.

Liste de contrôleChecklist

Cet article organise les pratiques validées pour les performances dans une check-list que vous pouvez suivre lors du développement de votre application de stockage Table.This article organizes proven practices for performance into a checklist you can follow while developing your Table storage application.

TerminéDone CategoryCategory Considérations relatives à la conceptionDesign consideration
  Objectifs de scalabilitéScalability targets Pouvez-vous concevoir votre application pour ne pas qu’elle utilise plus que le nombre maximal de comptes de stockage ?Can you design your application to use no more than the maximum number of storage accounts?
  Objectifs de scalabilitéScalability targets Cherchez-vous à ne pas vous approcher des limites de capacité et de transactions ?Are you avoiding approaching capacity and transaction limits?
  Objectifs de scalabilitéScalability targets Vous approchez-vous des objectifs d'évolutivité en termes d'entités par seconde ?Are you approaching the scalability targets for entities per second?
  Mise en réseauNetworking Les appareils côté client disposent-ils d’une bande passante suffisamment large et d’une latence suffisamment faible pour parvenir aux performances nécessaires ?Do client-side devices have sufficiently high bandwidth and low latency to achieve the performance needed?
  Mise en réseauNetworking La qualité du lien réseau côté client est-elle suffisamment élevée ?Do client-side devices have a high quality network link?
  Mise en réseauNetworking L’application cliente se trouve-t-elle dans la même région que le compte de stockage ?Is the client application in the same region as the storage account?
  Accès direct au clientDirect Client Access Utilisez-vous des signatures d’accès partagé (SAP) et un partage des ressources cross-origin (CORS) pour permettre l’accès direct au stockage Azure ?Are you using shared access signatures (SAS) and cross-origin resource sharing (CORS) to enable direct access to Azure Storage?
  Traitement par lotBatching Votre application traite-t-elle les mises à jour par lot à l’aide de transactions de groupe d’entités ?Is your application batching updates by using entity group transactions?
  Configuration .NET.NET configuration Utilisez-vous .NET Core 2.1 ou ultérieur pour obtenir des performances optimales ?Are you using .NET Core 2.1 or later for optimum performance?
  Configuration .NET.NET configuration Avez-vous configuré votre client pour qu'il utilise un nombre suffisant de connexions simultanées ?Have you configured your client to use a sufficient number of concurrent connections?
  Configuration .NET.NET configuration Pour les applications .NET, avez-vous configuré .NET pour qu’il utilise un nombre suffisant de threads ?For .NET applications, have you configured .NET to use a sufficient number of threads?
  ParallélismeParallelism Avez-vous vérifié que le parallélisme est limité de façon appropriée, de manière à ne pas surcharger les fonctionnalités de votre client ni s’approcher des objectifs de scalabilité ?Have you ensured that parallelism is bounded appropriately so that you don't overload your client's capabilities or approach the scalability targets?
  OutilsTools Utilisez-vous la version la plus récente des outils et bibliothèques clientes fournis par Microsoft ?Are you using the latest versions of Microsoft-provided client libraries and tools?
  Nouvelle tentativesRetries Utilisez-vous une stratégie de nouvelles tentatives avec backoff exponentiel pour les erreurs de limitation et les délais d’expiration ?Are you using a retry policy with an exponential backoff for throttling errors and timeouts?
  Nouvelle tentativesRetries Votre application empêche-t-elle les nouvelles tentatives pour les erreurs non renouvelables ?Is your application avoiding retries for non-retryable errors?
  ConfigurationConfiguration Utilisez-vous JSON pour vos demandes de table ?Are you using JSON for your table requests?
  ConfigurationConfiguration Avez-vous désactivé l’algorithme Nagle pour améliorer les performances des petites requêtes ?Have you turned off the Nagle algorithm to improve the performance of small requests?
  Tables et partitionsTables and partitions Avez-vous correctement partitionné vos données ?Have you properly partitioned your data?
  Partitions activesHot partitions Évitez-vous les modèles « Ajouter après uniquement » ou « Ajouter avant uniquement » ?Are you avoiding append-only and prepend-only patterns?
  Partitions activesHot partitions Vos opérations d'insertion/de mise à jour couvrent-elles plusieurs partitions ?Are your inserts/updates spread across many partitions?
  Étendue de requêteQuery scope Avez-vous conçu votre schéma pour qu'il autorise l'utilisation des requêtes de point dans la plupart des cas et l'utilisation modérée des requêtes de tables ?Have you designed your schema to allow for point queries to be used in most cases, and table queries to be used sparingly?
  Densité des requêtesQuery density En règle générale, vos requêtes n'analysent et ne renvoient-elles que les lignes qui seront utilisées par votre application ?Do your queries typically only scan and return rows that your application will use?
  Limitation des données retournéesLimiting returned data Utilisez-vous le filtrage pour éviter le renvoi d'entités inutiles ?Are you using filtering to avoid returning entities that are not needed?
  Limitation des données retournéesLimiting returned data Utilisez-vous la projection pour éviter le renvoi de propriétés inutiles ?Are you using projection to avoid returning properties that are not needed?
  DénormalisationDenormalization Avez-vous dénormalisé vos données de manière à éviter les requêtes inefficaces ou les demandes de lecture multiples lorsque vous essayez de récupérer des données ?Have you denormalized your data such that you avoid inefficient queries or multiple read requests when trying to get data?
  Insérer, mettre à jour et supprimerInsert, update, and delete Effectuez-vous un traitement par lots des demandes qui doivent être transactionnelles ou qui peuvent être effectuées en même temps pour réduire les allers-retours ?Are you batching requests that need to be transactional or can be done at the same time to reduce round-trips?
  Insérer, mettre à jour et supprimerInsert, update, and delete Évitez-vous de récupérer une entité pour déterminer simplement s'il faut appeler l'opération insert ou update ?Are you avoiding retrieving an entity just to determine whether to call insert or update?
  Insérer, mettre à jour et supprimerInsert, update, and delete Avez-vous envisagé de stocker des séries de données qui seront fréquemment récupérées ensemble dans une seule entité sous la forme de propriétés plutôt que d'entités multiples ?Have you considered storing series of data that will frequently be retrieved together in a single entity as properties instead of multiple entities?
  Insérer, mettre à jour et supprimerInsert, update, and delete Dans le cas des tables qui sont toujours récupérées ensemble et qui peuvent être écrites par lots (des données de séries temporelles, par exemple), avez-vous envisagé d’utiliser des objets blob à la place de tables ?For entities that will always be retrieved together and can be written in batches (for example, time series data), have you considered using blobs instead of tables?

Objectifs de scalabilitéScalability targets

Si votre application s’approche de l’un des objectifs d’extensibilité, voire le dépasse, une limitation ou des latences de transaction accrues peuvent survenir.If your application approaches or exceeds any of the scalability targets, it may encounter increased transaction latencies or throttling. Lorsque le stockage Azure limite votre application, le service commence à retourner les codes d’erreur 503 (Serveur occupé) ou 500 (Délai d’expiration de l’opération).When Azure Storage throttles your application, the service begins to return 503 (Server busy) or 500 (Operation timeout) error codes. Pour améliorer les performances de votre application, il est important d’éviter de telles erreurs en restant dans les limites des objectifs de scalabilité.Avoiding these errors by staying within the limits of the scalability targets is an important part of enhancing your application's performance.

Pour plus d’informations sur les objectifs de scalabilité concernant le service de Table, consultez Objectifs de scalabilité et de performances pour le stockage de tables.For more information about scalability targets for the Table service, see Scalability and performance targets for Table storage.

Nombre maximal de comptes de stockageMaximum number of storage accounts

Si vous atteignez le nombre maximal de comptes de stockage autorisés pour une combinaison abonnement-région, utilisez-vous plusieurs comptes de stockage afin d’effectuer un partitionnement en vue d’augmenter les entrées, les sorties, les opérations d’E/S par seconde (IOPS) ou la capacité ?If you're approaching the maximum number of storage accounts permitted for a particular subscription/region combination, are you using multiple storage accounts to shard to increase ingress, egress, I/O operations per second (IOPS), or capacity? Dans ce scénario, Microsoft recommande, si possible, de tirer parti de l’augmentation du nombre maximal de comptes de stockage, afin de réduire le nombre de comptes de stockage nécessaires pour votre charge de travail.In this scenario, Microsoft recommends that you take advantage of increased limits for storage accounts to reduce the number of storage accounts required for your workload if possible. Contactez le support Azure pour demander l’augmentation des limites de votre compte de stockage.Contact Azure Support to request increased limits for your storage account. Pour plus d’informations, consultez Annonce de comptes de stockage plus grands et à plus grande échelle.For more information, see Announcing larger, higher scale storage accounts.

Objectifs de capacité et de transactionCapacity and transaction targets

Si votre application s’approche des objectifs d’extensibilité d’un seul compte de stockage, pensez à appliquer l’une des méthodes suivantes :If your application is approaching the scalability targets for a single storage account, consider adopting one of the following approaches:

  • Réexaminez la charge de travail à cause de laquelle votre application s’approche de l’objectif d’extensibilité ou le dépasse.Reconsider the workload that causes your application to approach or exceed the scalability target. Est-il possible de la concevoir différemment pour qu’elle utilise moins de bande passante ou de capacité, ou moins de transactions ?Can you design it differently to use less bandwidth or capacity, or fewer transactions?
  • Si votre application doit dépasser l’un des objectifs de scalabilité, vous devez créer plusieurs comptes de stockage et partitionner vos données d’application sur ces comptes de stockage.If your application must exceed one of the scalability targets, then create multiple storage accounts and partition your application data across those multiple storage accounts. Si vous optez pour ce modèle, veillez à concevoir votre application de telle sorte que vous puissiez ajouter davantage de comptes de stockage à l’avenir en vue de l’équilibrage de la charge.If you use this pattern, then be sure to design your application so that you can add more storage accounts in the future for load balancing. Aucun coût autre que l’utilisation (données stockées, transactions effectuées, données transférées, etc.) n’est associé à ces comptes de stockage.Storage accounts themselves have no cost other than your usage in terms of data stored, transactions made, or data transferred.
  • Si votre application s’approche des objectifs de bande passante, pensez à compresser les données côté client afin de réduire la bande passante nécessaire à l’envoi des données au stockage Azure.If your application is approaching the bandwidth targets, consider compressing data on the client side to reduce the bandwidth required to send the data to Azure Storage. Même si la compression des données peut réduire la bande passante et améliorer les performances du réseau, elle présente des inconvénients.While compressing data may save bandwidth and improve network performance, it can also have negative effects on performance. Évaluez l’impact sur les performances qu’entraînent les exigences de traitement supplémentaires liées à la compression et à la décompression des données côté client.Evaluate the performance impact of the additional processing requirements for data compression and decompression on the client side. Gardez à l’esprit que le stockage de données compressées peut compliquer la résolution des problèmes, car il peut être plus difficile de voir les données à l’aide d’outils standard.Keep in mind that storing compressed data can make troubleshooting more difficult because it may be more challenging to view the data using standard tools.
  • Si votre application s’approche des objectifs de scalabilité, vérifiez que vous utilisez bien un backoff exponentiel pour les nouvelles tentatives.If your application is approaching the scalability targets, then make sure that you are using an exponential backoff for retries. Il est préférable d’éviter de s’approcher des objectifs de scalabilité en implémentant les recommandations fournies dans cet article.It's best to try to avoid reaching the scalability targets by implementing the recommendations described in this article. Toutefois, l’utilisation d’un backoff exponentiel pour les nouvelles tentatives va empêcher votre application d’effectuer une nouvelle tentative rapidement, ce qui pourrait compliquer la limitation.However, using an exponential backoff for retries will prevent your application from retrying rapidly, which could make throttling worse. Pour plus d’informations, consultez la section intitulée Erreurs d’expiration de délai et de serveur occupé.For more information, see the section titled Timeout and Server Busy errors.

Cibles pour les opérations de donnéesTargets for data operations

Stockage Azure équilibre la charge à mesure que le trafic vers votre compte de stockage augmente, mais si le trafic présente des rafales soudaines, vous risquez de ne pas pouvoir récupérer ce volume de débit immédiatement.Azure Storage load balances as the traffic to your storage account increases, but if the traffic exhibits sudden bursts, you may not be able to get this volume of throughput immediately. Attendez-vous à constater une limitation et/ou des délais d’expiration pendant la rafale, car Stockage Azure équilibre automatiquement la charge de votre table.Expect to see throttling and/or timeouts during the burst as Azure Storage automatically load balances your table. Une accélération progressive procure généralement de meilleurs résultats, car le système a le temps d’équilibrer la charge de manière appropriée.Ramping up slowly generally provides better results, as the system has time to load balance appropriately.

Entités par seconde (compte)Entities per second (storage account)

S’agissant de l’accès aux tables, la limite de scalabilité est de 20 000 entités (d’une taille individuelle de 1 Ko) par seconde pour un compte.The scalability limit for accessing tables is up to 20,000 entities (1 KB each) per second for an account. En règle générale, chaque entité insérée, mise à jour, supprimée ou analysée est comptabilisée.In general, each entity that is inserted, updated, deleted, or scanned counts toward this target. Une insertion par lots composée de 100 entités compte donc pour 100 entités.So a batch insert that contains 100 entities would count as 100 entities. De même, une requête qui analyse 1 000 entités et en renvoie 5 compte pour 1 000 entités.A query that scans 1000 entities and returns 5 would count as 1000 entities.

Entités par seconde (partition)Entities per second (partition)

Dans une partition unique, l’objectif de scalabilité pour l’accès aux tables est de 2 000 entités (d’une taille individuelle de 1 Ko) par seconde, en utilisant le même mode de calcul que celui décrit dans la section précédente.Within a single partition, the scalability target for accessing tables is 2,000 entities (1 KB each) per second, using the same counting as described in the previous section.

Mise en réseauNetworking

Les contraintes de réseau physiques de l’application peuvent avoir un impact majeur sur les performances.The physical network constraints of the application may have a significant impact on performance. Les sections suivantes abordent certaines des limitations auxquelles les utilisateurs peuvent être confrontés.The following sections describe some of limitations users may encounter.

Fonctionnalités réseau du clientClient network capability

La bande passante et la qualité du lien réseau jouent un rôle important dans les performances de l’application, comme l’expliquent les sections suivantes.Bandwidth and the quality of the network link play important roles in application performance, as described in the following sections.

DébitThroughput

Dans le cas de la bande passante, le problème est souvent dû aux capacités du client.For bandwidth, the problem is often the capabilities of the client. Dans le cas des instances Azure plus importantes, les cartes réseau présentent une capacité supérieure. Si vous avez besoin de limites réseau plus élevées à partir d’un seul ordinateur, vous devez donc envisager d’utiliser une instance plus grande ou davantage de machines virtuelles.Larger Azure instances have NICs with greater capacity, so you should consider using a larger instance or more VMs if you need higher network limits from a single machine. Si vous accédez au stockage Azure à partir d’une application locale, alors la même règle s’applique : comprendre les capacités réseau de l’appareil client et la connectivité réseau à l’emplacement de stockage Azure, et l’améliorer selon vos besoins ou concevoir votre application conformément à ces capacités.If you are accessing Azure Storage from an on premises application, then the same rule applies: understand the network capabilities of the client device and the network connectivity to the Azure Storage location and either improve them as needed or design your application to work within their capabilities.

Comme c’est le cas pour toute utilisation du réseau, n’oubliez pas que les conditions réseau qui génèrent des erreurs et une perte de paquets ralentissent le débit effectif.As with any network usage, keep in mind that network conditions resulting in errors and packet loss will slow effective throughput. L’utilisation de WireShark ou de NetMon peut vous aider à diagnostiquer ce problème.Using WireShark or NetMon may help in diagnosing this issue.

EmplacementLocation

Dans un environnement distribué, le fait de placer le client à proximité du serveur se traduit par des performances optimales.In any distributed environment, placing the client near to the server delivers in the best performance. Pour accéder à Azure Storage avec un minimum de latence, votre client doit idéalement se trouver dans la même région Azure.For accessing Azure Storage with the lowest latency, the best location for your client is within the same Azure region. Par exemple, si vous disposez d’un site web Azure qui utilise le stockage Azure, tous deux doivent se trouver dans la même région (USA Ouest ou Asie Sud-Est, par exemple).For example, if you have an Azure web app that uses Azure Storage, then locate them both within a single region, such as US West or Asia Southeast. Cela réduit à la fois la latence et les coûts, puisque l’utilisation de la bande passante dans une seule région était gratuite.Co-locating resources reduces the latency and the cost, as bandwidth usage within a single region is free.

Si des applications clientes accèdent au stockage Azure sans être hébergées dans Azure (c’est le cas, par exemple, des applications pour appareil mobile ou des services d’entreprise locaux), le fait de placer le compte de stockage dans une région proche de ces appareils peut réduire la latence.If client applications will access Azure Storage but are not hosted within Azure, such as mobile device apps or on premises enterprise services, then locating the storage account in a region near to those clients may reduce latency. Si vos clients sont distribués à grande échelle (par exemple, certains en Amérique du Nord et d’autres en Europe), il est conseillé d’utiliser un compte de stockage pour chaque région.If your clients are broadly distributed (for example, some in North America, and some in Europe), then consider using one storage account per region. Cette méthode est plus facile à implémenter si les données stockées par l’application sont propres à certains utilisateurs, et elle ne nécessite pas de réplication des données entre différents comptes de stockage.This approach is easier to implement if the data the application stores is specific to individual users, and does not require replicating data between storage accounts.

SAP et CORSSAS and CORS

Supposons que vous deviez autoriser du code, tel que du code JavaScript qui s’exécute dans le navigateur web d’un utilisateur ou dans une application de téléphone mobile, à accéder aux données du stockage Azure.Suppose that you need to authorize code such as JavaScript that is running in a user's web browser or in a mobile phone app to access data in Azure Storage. L’une des méthodes possibles consiste à créer une application de service qui serve de proxy.One approach is to build a service application that acts as a proxy. L’appareil de l’utilisateur s’authentifie auprès du service, qui à son tour autorise l’accès aux ressources du stockage Azure.The user's device authenticates with the service, which in turn authorizes access to Azure Storage resources. Vous évitez ainsi d’exposer vos clés de compte de stockage sur des appareils non sécurisés.In this way, you can avoid exposing your storage account keys on insecure devices. Cependant, cette méthode entraîne une surcharge importante pour l’application du service, dans la mesure où toutes les données transférées entre l’appareil de l’utilisateur et le stockage Azure doivent transiter par l’application du service.However, this approach places a significant overhead on the service application, because all of the data transferred between the user's device and Azure Storage must pass through the service application.

Vous pouvez éviter d’utiliser une application de service en tant que proxy pour le stockage Azure en utilisant des signatures d’accès partagé (SAS).You can avoid using a service application as a proxy for Azure Storage by using shared access signatures (SAS). Avec les signatures d’accès partagé, vous pouvez autoriser l’appareil de votre utilisateur à adresser directement des requêtes au stockage Azure par le biais d’un jeton à accès limité.Using SAS, you can enable your user's device to make requests directly to Azure Storage by using a limited access token. Par exemple, si un utilisateur souhaite charger une photo vers votre application, votre application de service peut générer une signature d’accès partagé et l’envoyer à l’appareil de l’utilisateur.For example, if a user wants to upload a photo to your application, then your service application can generate a SAS and send it to the user's device. Le jeton SAS peut accorder l’autorisation d’écrire dans une ressource du stockage Azure pendant un intervalle de temps spécifié, au bout duquel le jeton SAS expire.The SAS token can grant permission to write to an Azure Storage resource for a specified interval of time, after which the SAS token expires. Pour plus d’informations sur les SAS, consultez Accorder un accès limité aux ressources du Stockage Azure à l’aide des signatures d’accès partagé (SAS).For more information about SAS, see Grant limited access to Azure Storage resources using shared access signatures (SAS).

En règle générale, un navigateur web n’autorise pas le code JavaScript d’une page hébergée par un site web d’un domaine à effectuer certaines opérations, telles que les opérations d’écriture, sur un autre domaine.Typically, a web browser will not allow JavaScript in a page that is hosted by a website on one domain to perform certain operations, such as write operations, to another domain. Connue sous le nom de stratégie de même origine, cette stratégie empêche un script malveillant d’une page d’obtenir l’accès aux données d’une autre page web.Known as the same-origin policy, this policy prevents a malicious script on one page from obtaining access to data on another web page. Toutefois, la stratégie de même origine peut représenter un obstacle lorsque vous créez une solution dans le cloud.However, the same-origin policy can be a limitation when building a solution in the cloud. Le partage des ressources cross-origin (CORS) est une fonctionnalité de navigateur qui autorise le domaine cible à indiquer au navigateur que vous approuvez les requêtes en provenance du domaine source.Cross-origin resource sharing (CORS) is a browser feature that enables the target domain to communicate to the browser that it trusts requests originating in the source domain.

Supposons, par exemple, qu’une application web exécutée dans Azure envoie une requête pour une ressource à un compte de stockage Azure.For example, suppose a web application running in Azure makes a request for a resource to an Azure Storage account. L’application web est le domaine source, et le compte de stockage est le domaine cible.The web application is the source domain, and the storage account is the target domain. Vous pouvez configurer le partage des ressources cross-origin pour l’un des services du stockage Azure afin d’indiquer au navigateur web que les requêtes provenant du domaine source sont approuvées par le stockage Azure.You can configure CORS for any of the Azure Storage services to communicate to the web browser that requests from the source domain are trusted by Azure Storage. Pour plus d’informations sur le partage des ressources cross-origin, consultez Prise en charge du partage des ressources cross-origin (CORS) pour le stockage Azure.For more information about CORS, see Cross-origin resource sharing (CORS) support for Azure Storage.

Les signatures d’accès partagé et le partage des ressources cross-origin vous aident à éviter une charge inutile sur votre application web.Both SAS and CORS can help you avoid unnecessary load on your web application.

Transactions par lotsBatch transactions

Le service de Table prend en charge les transactions par lots sur les entités qui se trouvent dans la même table et qui appartiennent au même groupe de partitions.The Table service supports batch transactions on entities that are in the same table and belong to the same partition group. Pour plus d’informations, consultez Effectuer des transactions de groupe d’entités.For more information, see Performing entity group transactions.

Configuration .NET.NET configuration

Si vous utilisez .NET Framework, vous trouverez dans cette section plusieurs paramètres de configuration rapide que vous pouvez appliquer pour améliorer sensiblement les performances.If using the .NET Framework, this section lists several quick configuration settings that you can use to make significant performance improvements. Si vous utilisez un autre langage, vérifiez si des concepts similaires y sont associés.If using other languages, check to see if similar concepts apply in your chosen language.

Utiliser .NET CoreUse .NET Core

Développez vos applications du stockage Azure avec .NET Core 2.1 ou ultérieur pour tirer parti des performances améliorées.Develop your Azure Storage applications with .NET Core 2.1 or later to take advantage of performance enhancements. L’utilisation de .NET Core 3.x est recommandée dans la mesure du possible.Using .NET Core 3.x is recommended when possible.

Pour plus d’informations sur les améliorations des performances dans .NET Core, consultez les billets de blog suivants :For more information on performance improvements in .NET Core, see the following blog posts:

Augmenter la limite de connexions par défautIncrease default connection limit

Dans .NET, le code suivant augmente la limite de connexions par défaut (qui est généralement de 2 dans un environnement client ou de 10 dans un environnement de serveur) à 100.In .NET, the following code increases the default connection limit (which is usually 2 in a client environment or 10 in a server environment) to 100. En règle générale, vous devez définir la valeur sur environ le nombre de threads utilisés par votre application.Typically, you should set the value to approximately the number of threads used by your application.

ServicePointManager.DefaultConnectionLimit = 100; //(Or More)  

Définissez la limite de connexions avant d’ouvrir une connexion.Set the connection limit before opening any connections.

Pour les autres langages de programmation, voir la documentation correspondante pour savoir comment définir la limite de connexions.For other programming languages, see that language's documentation to determine how to set the connection limit.

Pour plus d’informations, consultez le billet de blog Services web : connexions simultanées.For more information, see the blog post Web Services: Concurrent Connections.

Augmenter le nombre minimal de threadsIncrease minimum number of threads

Si vous utilisez des appels synchrones avec des tâches asynchrones, vous aurez peut-être besoin d’augmenter le nombre de threads dans le pool de threads :If you are using synchronous calls together with asynchronous tasks, you may want to increase the number of threads in the thread pool:

ThreadPool.SetMinThreads(100,100); //(Determine the right number for your application)  

Pour plus d’informations, consultez la méthode ThreadPool.SetMinThreads.For more information, see the ThreadPool.SetMinThreads method.

Parallélisme illimitéUnbounded parallelism

Même si le parallélisme peut être très utile pour les performances, soyez prudent lorsque vous utilisez le parallélisme illimité, car il n’existe aucune limite concernant le nombre de threads ou de requêtes parallèles.While parallelism can be great for performance, be careful about using unbounded parallelism, meaning that there is no limit enforced on the number of threads or parallel requests. Veillez à limiter les requêtes parallèles pour charger ou télécharger des données, pour accéder à plusieurs partitions dans un même compte de stockage ou pour accéder à plusieurs éléments d’une même partition.Be sure to limit parallel requests to upload or download data, to access multiple partitions in the same storage account, or to access multiple items in the same partition. Si vous optez pour un parallélisme illimité, votre application peut dépasser les capacités de l’appareil client ou les objectifs de scalabilité du compte de stockage, ce qui se traduit par des temps de latence plus importants et par une limitation.If parallelism is unbounded, your application can exceed the client device's capabilities or the storage account's scalability targets, resulting in longer latencies and throttling.

Outils et bibliothèques clientesClient libraries and tools

Pour des performances optimales, utilisez toujours les bibliothèques clientes et les outils fournis par Microsoft les plus récents.For best performance, always use the latest client libraries and tools provided by Microsoft. Les bibliothèques clientes du stockage Azure sont disponibles pour plusieurs langages.Azure Storage client libraries are available for a variety of languages. Le stockage Azure prend également en charge PowerShell et Azure CLI.Azure Storage also supports PowerShell and Azure CLI. Microsoft s’attelle au développement de ces outils et de ces bibliothèques clientes dans une optique de performances. Il veille à leur mise à jour continue avec les versions de service les plus récentes et s’assure qu’ils répondent, en interne, à la plupart des pratiques validées concernant les performances.Microsoft actively develops these client libraries and tools with performance in mind, keeps them up-to-date with the latest service versions, and ensures that they handle many of the proven performance practices internally.

Gérer les erreurs de serviceHandle service errors

Le stockage Azure retourne une erreur lorsque le service ne peut pas traiter une requête.Azure Storage returns an error when the service cannot process a request. Le fait de comprendre les erreurs qui peuvent être retournées par le stockage Azure dans un scénario donné permet d’optimiser les performances.Understanding the errors that may be returned by Azure Storage in a given scenario is helpful for optimizing performance.

Erreurs d’expiration de délai et de serveur occupéTimeout and Server Busy errors

Le stockage Azure peut limiter votre application si celle-ci s’approche des limites de scalabilité.Azure Storage may throttle your application if it approaches the scalability limits. Dans certains cas, le stockage Azure peut ne pas être en mesure de traiter une requête en raison d’un problème temporaire.In some cases, Azure Storage may be unable to handle a request due to some transient condition. Dans les deux cas, le service peut retourner une erreur 503 (Serveur occupé) ou une erreur 500 (Délai expiré).In both cases, the service may return a 503 (Server Busy) or 500 (Timeout) error. Ces erreurs peuvent également se produire si le service rééquilibre les partitions de données pour permettre un débit plus élevé.These errors can also occur if the service is rebalancing data partitions to allow for higher throughput. L’application cliente doit généralement retenter l’opération qui provoque l’une de ces erreurs.The client application should typically retry the operation that causes one of these errors. Cependant, si le stockage Azure limite votre application en raison d’un dépassement des objectifs de scalabilité, ou si le service n’a pas été en mesure de répondre à la requête pour une autre raison, le fait d’effectuer des nouvelles tentatives agressives ne fait généralement qu’aggraver le problème.However, if Azure Storage is throttling your application because it is exceeding scalability targets, or even if the service was unable to serve the request for some other reason, aggressive retries may make the problem worse. Il est recommandé d’utiliser une stratégie de nouvelle tentative de type backoff exponentiel. Les bibliothèques clientes adopteront par défaut ce comportement.Using an exponential back off retry policy is recommended, and the client libraries default to this behavior. Votre application peut, par exemple, effectuer une nouvelle tentative après 2 secondes, puis 4 secondes, 10 secondes, 30 secondes avant d’abandonner complètement.For example, your application may retry after 2 seconds, then 4 seconds, then 10 seconds, then 30 seconds, and then give up completely. De cette façon, votre application réduit considérablement la charge sur le service, au lieu d’aggraver un comportement susceptible d’entraîner une limitation.In this way, your application significantly reduces its load on the service, rather than exacerbating behavior that could lead to throttling.

Les erreurs de connectivité ne sont pas dues à une limitation et sont généralement temporaires. Dès lors, de nouvelles tentatives peuvent être effectuées immédiatement.Connectivity errors can be retried immediately, because they are not the result of throttling and are expected to be transient.

Erreurs non renouvelablesNon-retryable errors

Les bibliothèques clientes gèrent les nouvelles tentatives en sachant quelles erreurs peuvent être retentées.The client libraries handle retries with an awareness of which errors can be retried and which cannot. Toutefois, si vous appelez directement l’API REST du stockage Azure, il y a des erreurs que vous ne devez pas renouveler.However, if you are calling the Azure Storage REST API directly, there are some errors that you should not retry. Par exemple, une erreur 400 (Requête incorrecte) indique que l’application cliente a envoyé une requête qui n’a pas pu être traitée, car elle n’était pas au format attendu.For example, a 400 (Bad Request) error indicates that the client application sent a request that could not be processed because it was not in the expected form. Le fait de renvoyer cette requête générera à chaque fois la même réponse, il ne sert donc à rien de la renvoyer.Resending this request results the same response every time, so there is no point in retrying it. Si vous appelez directement l’API REST du stockage Azure, tenez compte des erreurs potentielles et déterminez si elles doivent être retentées.If you are calling the Azure Storage REST API directly, be aware of potential errors and whether they should be retried.

Pour plus d’informations sur les codes d’erreur du stockage Azure, consultez Codes d’état et d’erreur.For more information on Azure Storage error codes, see Status and error codes.

ConfigurationConfiguration

Cette section décrit les paramètres de configuration rapide que vous pouvez utiliser pour améliorer sensiblement les performances du service de Table :This section lists several quick configuration settings that you can use to make significant performance improvements in the Table service:

Avec JSONUse JSON

Depuis la version 2013-08-15 du service de stockage, le service de Table prend en charge l’utilisation de JSON plutôt que le format AtomPub XML pour transférer des données de table.Beginning with storage service version 2013-08-15, the Table service supports using JSON instead of the XML-based AtomPub format for transferring table data. L’utilisation du format JSON permet de réduire la taille de la charge utile de quelque 75 % et d’améliorer sensiblement les performances de votre application.Using JSON can reduce payload sizes by as much as 75% and can significantly improve the performance of your application.

Pour plus d’informations, consultez Tables Microsoft Azure : présentation de JSON et Format de charge utile pour les opérations du service de Table.For more information, see the post Microsoft Azure Tables: Introducing JSON and Payload Format for Table Service Operations.

Désactiver NagleDisable Nagle

L’algorithme de Nagle est utilisé à grande échelle sur les réseaux TCP/IP en vue d’améliorer les performances du réseau.Nagle's algorithm is widely implemented across TCP/IP networks as a means to improve network performance. Cependant, il n’est pas idéal dans toutes les situations (c’est le cas, par exemple, dans les environnements très interactifs).However, it is not optimal in all circumstances (such as highly interactive environments). L’algorithme Nagle a un impact négatif sur les performances des requêtes adressées aux services Table et File d’attente Azure. Vous devez donc le désactiver si cela s’avère possible.Nagle's algorithm has a negative impact on the performance of requests to the Azure Table service, and you should disable it if possible.

schémaSchema

Le mode de représentation et d’interrogation de vos données constitue le principal facteur ayant une incidence sur les performances du service de Table.How you represent and query your data is the biggest single factor that affects the performance of the Table service. Bien que chaque application soit différente, cette section énumère quelques pratiques générales concernant les points suivants :While every application is different, this section outlines some general proven practices that relate to:

  • Conception de tablesTable design
  • Requêtes efficacesEfficient queries
  • Mises à jour de données efficacesEfficient data updates

Tables et partitionsTables and partitions

Les tables sont divisées en partitions.Tables are divided into partitions. Toutes les entités stockées dans une partition partagent la même clé de partition et sont associées à une clé de ligne pour les identifier dans cette partition.Every entity stored in a partition shares the same partition key and has a unique row key to identify it within that partition. Les partitions offrent des avantages, mais elles s’accompagnent également de limites d’extensibilité.Partitions provide benefits but also introduce scalability limits.

  • Avantages : vous pouvez mettre à jour des entités d’une même partition au cours d’une seule transaction atomique par lots pouvant contenir jusqu’à 100 opérations de stockage distinctes (taille totale limite de 4 Mo).Benefits: You can update entities in the same partition in a single, atomic, batch transaction that contains up to 100 separate storage operations (limit of 4 MB total size). En partant du principe que le même nombre d’entités doit être récupéré, vous pouvez également interroger plus efficacement les données d’une seule partition que celles qui couvrent plusieurs partitions (vous trouverez d’autres conseils sur l’interrogation des données de table dans la suite de ce document).Assuming the same number of entities to be retrieved, you can also query data within a single partition more efficiently than data that spans partitions (though read on for further recommendations on querying table data).
  • Limite d’extensibilité : l’accès aux entités stockées dans une seule partition ne peut pas faire l’objet d’un équilibrage de la charge, car les partitions prennent en charge les transactions atomiques par lots.Scalability limit: Access to entities stored in a single partition cannot be load-balanced because partitions support atomic batch transactions. C’est pourquoi l’objectif de scalabilité d’une partition de table individuelle est inférieur à celui du service de Table dans son ensemble.For this reason, the scalability target for an individual table partition is lower than for the Table service as a whole.

Compte tenu des caractéristiques des tables et des partitions, il est conseillé d’adopter les principes de conception suivants :Because of these characteristics of tables and partitions, you should adopt the following design principles:

  • Localisez les données que votre application cliente met à jour ou interroge fréquemment dans une même unité de travail logique au sein d’une même partition.Locate data that your client application frequently updates or queries in the same logical unit of work in the same partition. Par exemple, localisez les données d’une même partition si votre application regroupe des écritures ou si vous effectuez des opérations de traitement par lots atomiques.For example, locate data in the same partition if your application is aggregating writes or you are performing atomic batch operations. Ajoutons encore que les données d’une seule partition peuvent être interrogées plus efficacement dans une seule requête que les données de plusieurs partitions.Also, data in a single partition can be more efficiently queried in a single query than data across partitions.
  • Localisez les données que votre application cliente n’insère pas, ne met pas à jour ou n’interroge pas dans une même unité de travail logique (requête unique ou mise à jour par lots) sur des partitions distinctes.Locate data that your client application does not insert, update, or query in the same logical unit of work (that is, in a single query or batch update) in separate partitions. N’oubliez pas que le nombre de clés de partition d’une même table n’est pas limité. Le fait qu’il y ait plusieurs millions de clés de partition ne constitue donc pas un problème et n’a aucune incidence sur les performances.Keep in mind that there is no limit to the number of partition keys in a single table, so having millions of partition keys is not a problem and will not impact performance. Par exemple, si votre application est un site web populaire auquel les utilisateurs doivent se connecter, il peut être judicieux de choisir l’ID utilisateur comme clé de partition.For example, if your application is a popular website with user login, using the User ID as the partition key could be a good choice.

Partitions activesHot partitions

On appelle « partition active » une partition qui reçoit un pourcentage disproportionné du trafic vers un compte et qui ne peut pas faire l’objet d’un équilibrage de la charge, car il s’agit d’une partition unique.A hot partition is one that is receiving a disproportionate percentage of the traffic to an account, and cannot be load balanced because it is a single partition. En règle générale, la création des partitions actives s’effectue de l’une des façons suivantes :In general, hot partitions are created one of two ways:

Modèles « Ajouter après uniquement » et « Ajouter avant uniquement »Append Only and Prepend Only patterns

Avec le modèle « Ajouter après uniquement », l’intégralité (ou la grande majorité) du trafic à destination d’une clé de partition donnée augmente et diminue en fonction de l’heure.The "Append Only" pattern is one where all (or nearly all) of the traffic to a given partition key increases and decreases according to the current time. Par exemple, supposons que votre application utilise la date du jour comme clé de partition pour les données de journal.For example, suppose that your application uses the current date as a partition key for log data. De cette façons, toutes les insertions sont placées dans la dernière partition de votre table et le système ne peut pas équilibrer la charge correctement.This design results in all of the inserts going to the last partition in your table, and the system cannot load balance properly. Si le trafic à destination de cette partition dépasse l’objectif d’extensibilité au niveau de la partition, cela se traduit par une limitation.If the volume of traffic to that partition exceeds the partition-level scalability target, then it will result in throttling. Il est préférable de s’assurer que le trafic est envoyé vers plusieurs partitions, afin de permettre l’équilibrage de la charge des demandes sur votre table.It's better to ensure that traffic is sent to multiple partitions, to enable load balance the requests across your table.

Données à trafic élevéHigh-traffic data

Si votre schéma de partitionnement donne lieu à une seule partition qui comporte simplement les données qui sont beaucoup plus utilisées que d’autres partitions, le phénomène de limitation risque également de se présenter à mesure que cette partition unique s’approche de son objectif d’extensibilité.If your partitioning scheme results in a single partition that just has data that is far more used than other partitions, you may also see throttling as that partition approaches the scalability target for a single partition. Il est conseillé de faire en sorte que votre schéma de partitionnement ne génère pas une partition unique qui s’approche des objectifs d’extensibilité.It's better to make sure that your partition scheme results in no single partition approaching the scalability targets.

InterrogationQuerying

Cette section décrit les pratiques validées concernant l’interrogation du service de Table.This section describes proven practices for querying the Table service.

Étendue de requêteQuery scope

Pour spécifier la plage des entités à interroger, vous pouvez procéder de plusieurs façons.There are several ways to specify the range of entities to query. La liste ci-dessous décrit chaque option pour l’étendue de requête.The following list describes each option for query scope.

  • Requêtes de point : une requête de point récupère exactement une entité en spécifiant à la fois la clé de partition et la clé de ligne de l’entité à récupérer.Point queries:- A point query retrieves exactly one entity by specifying both the partition key and row key of the entity to retrieve. Ces requêtes sont efficaces et nous vous conseillons de les utiliser dans la mesure du possible.These queries are efficient, and you should use them wherever possible.
  • Requêtes de partition : Une requête de partition récupère un jeu de données qui partagent une clé de partition commune.Partition queries: A partition query is a query that retrieves a set of data that shares a common partition key. En règle générale, cette requête spécifie une plage de valeurs de clé de ligne ou une plage de valeurs pour une propriété d’entité, en plus d’une clé de partition.Typically, the query specifies a range of row key values or a range of values for some entity property in addition to a partition key. ces requêtes sont moins efficaces que les requêtes de point et doivent être utilisées avec modération.These queries are less efficient than point queries, and should be used sparingly.
  • Requêtes de table : Une requête de table récupère un jeu d’entités ne partageant pas une clé de partition commune.Table queries: A table query is a query that retrieves a set of entities that does not share a common partition key. Les requêtes de ce type ne sont pas efficaces et il est conseillé de les éviter dans la mesure du possible.These queries are not efficient and you should avoid them if possible.

En règle générale, il est conseillé d’éviter les analyses (requêtes d’une taille supérieure à une seule entité). Cependant, si vous devez procéder de la sorte, tâchez d’organiser vos données de façon à ce que les analyses les récupèrent sans qu’il faille examiner ou renvoyer de grandes quantités d’entités dont vous n’avez pas besoin.In general, avoid scans (queries larger than a single entity), but if you must scan, try to organize your data so that your scans retrieve the data you need without scanning or returning significant amounts of entities you don't need.

Densité des requêtesQuery density

S’agissant de l’efficacité des requêtes, un autre facteur important est le nombre d’entités renvoyées par rapport au nombre d’entités analysées pour obtenir le jeu renvoyé.Another key factor in query efficiency is the number of entities returned as compared to the number of entities scanned to find the returned set. Si votre application effectue une requête de table avec un filtre pour une valeur de propriété partagée par seulement 1 % des données, la requête analyse 100 entités pour chaque entité renvoyée.If your application performs a table query with a filter for a property value that only 1% of the data shares, the query will scan 100 entities for every one entity it returns. Les objectifs de scalabilité de table abordés précédemment sont liés au nombre d’entités analysées et non au nombre d’entités retournées : une densité de requête faible peut facilement générer un service de Table qui limite votre application, car il convient d’analyser de nombreuses entités pour récupérer l’entité que vous recherchez.The table scalability targets discussed previously all relate to the number of entities scanned, and not the number of entities returned: a low query density can easily cause the Table service to throttle your application because it must scan so many entities to retrieve the entity you are looking for. Pour savoir comment éviter la limitation, consultez la section intitulée Dénormalisation .For more information on how to avoid throttling, see the section titled Denormalization.

Limitation du volume de données renvoyéLimiting the amount of data returned

Lorsque vous savez qu’une requête va retourner des entités dont vous n’avez pas besoin dans l’application cliente, pensez à utiliser un filtre afin de réduire la taille du jeu retourné.When you know that a query will return entities that you don't need in the client application, consider using a filter to reduce the size of the returned set. Bien que les entités non renvoyées au client soient comptabilisées dans les limites d’extensibilité, les performances de votre application s’en trouveront améliorées, compte tenu de la taille réduite de charge utile du réseau et de la réduction du nombre d’entités traitées par votre application cliente.While the entities not returned to the client still count toward the scalability limits, your application performance will improve because of the reduced network payload size and the reduced number of entities that your client application must process. N’oubliez pas que les objectifs de scalabilité font référence au nombre d’entités analysées, et donc, qu’il se peut qu’une requête qui exclut de nombreuses entités donne toujours lieu à une limitation, même si le nombre d’entités retournées est faible.Keep in mind that the scalability targets relate to the number of entities scanned, so a query that filters out many entities may still result in throttling, even if few entities are returned. Pour plus d’informations sur l’efficacité des requêtes, consultez la section intitulée Densité des requêtes.For more information on making queries efficient, see the section titled Query density.

Si votre application cliente nécessite seulement un jeu limité de propriétés des entités de votre table, vous pouvez utiliser la projection pour limiter la taille du jeu de données renvoyé.If your client application needs only a limited set of properties from the entities in your table, you can use projection to limit the size of the returned data set. Comme c’est le cas avec le filtrage, la projection permet de réduire la charge réseau et le traitement du client.As with filtering, projection helps to reduce network load and client processing.

DénormalisationDenormalization

Contrairement à l’utilisation des bases de données relationnelles, les pratiques éprouvées pour interroger efficacement des données de table entraînent leur dénormalisation.Unlike working with relational databases, the proven practices for efficiently querying table data lead to denormalizing your data. Cette opération consiste à dupliquer les mêmes données dans plusieurs entités (une pour chaque clé utilisable pour rechercher les données) afin de réduire le nombre d’entités qu’une requête doit analyser pour rechercher les données dont le client a besoin, plutôt que d’analyser de grandes quantités d’entités pour rechercher les données dont votre application a besoin.That is, duplicating the same data in multiple entities (one for each key you may use to find the data) to minimize the number of entities that a query must scan to find the data the client needs, rather than having to scan large numbers of entities to find the data your application needs. Sur un site web de commerce électronique, par exemple, vous pouvez rechercher une commande en fonction de l’ID du client (rechercher les commandes de ce client) et de la date (rechercher les commandes passées à une date donnée).For example, in an e-commerce website, you may want to find an order both by the customer ID (give me this customer's orders) and by the date (give me orders on a date). Dans le stockage de tables, il est préférable de stocker l’entité (ou une référence à celle-ci) à deux reprises : une fois avec le nom de la table, la clé de partition et la clé de ligne afin de faciliter la recherche en fonction de l’ID de client, et une fois pour faciliter la recherche en fonction de la date.In Table Storage, it is best to store the entity (or a reference to it) twice – once with Table Name, PK, and RK to facilitate finding by customer ID, once to facilitate finding it by the date.

Insérer, mettre à jour et supprimerInsert, update, and delete

Cette section décrit les pratiques validées concernant la modification des entités stockées dans le service de Table.This section describes proven practices for modifying entities stored in the Table service.

Traitement par lotBatching

Les transactions par lots sont appelées transactions de groupe d’entités dans le stockage Azure.Batch transactions are known as entity group transactions in Azure Storage. Toutes les opérations d’une transaction de groupe d’entités doivent se trouver sur une même partition d’une même table.All operations within an entity group transaction must be on a single partition in a single table. Lorsque cela s’avère possible, utilisez des transactions de groupe d’entités pour effectuer des opérations d’insertion, de mise à jour et de suppression par lots.Where possible, use entity group transactions to perform inserts, updates, and deletes in batches. L’utilisation de transactions de groupe d’entités réduit le nombre d’allers-retours entre votre application cliente et le serveur, ainsi que le nombre de transactions facturables (une transaction de groupe d’entités est comptabilisée comme une seule transaction à des fins de facturation et peut contenir 100 opérations de stockage), et autorise les mises à jour atomiques (dans une transaction de groupe d’entités, toutes les opérations réussissent ou échouent).Using entity group transactions reduces the number of round trips from your client application to the server, reduces the number of billable transactions (an entity group transaction counts as a single transaction for billing purposes and can contain up to 100 storage operations), and enables atomic updates (all operations succeed or all fail within an entity group transaction). L’utilisation des transactions de groupe d’entités peut apporter des avantages non négligeables dans les environnements où les temps de latence sont élevés, tels que les appareils mobiles.Environments with high latencies such as mobile devices will benefit greatly from using entity group transactions.

UpsertUpsert

Lorsque cela s'avère possible, il est conseillé d'utiliser des opérations de table Upsert .Use table Upsert operations wherever possible. Il existe deux types d’opération Upsert ; tous deux peuvent se révéler plus efficaces que les opérations Insert et Update classiques :There are two types of Upsert, both of which can be more efficient than a traditional Insert and Update operations:

  • InsertOrMerge : Utilisez cette opération lorsque vous souhaitez charger un sous-ensemble des propriétés de l’entité, mais ne savez pas si cette dernière existe déjà.InsertOrMerge: Use this operation when you want to upload a subset of the entity's properties, but aren't sure whether the entity already exists. Si elle existe, cet appel met à jour les propriétés incluses dans l’opération Upsert et laisse toutes les propriétés existantes en l’état. Si elle n’existe pas, cet appel insère la nouvelle entité.If the entity exists, this call updates the properties included in the Upsert operation, and leaves all existing properties as they are, if the entity does not exist, it inserts the new entity. Cela revient à utiliser la projection dans une requête, en ce sens que vous devez simplement télécharger les propriétés qui sont modifiées.This is similar to using projection in a query, in that you only need to upload the properties that are changing.
  • InsertOrReplace : Utilisez cette opération lorsque vous souhaitez charger une toute nouvelle entité, mais ne savez pas si cette dernière existe déjà.InsertOrReplace: Use this operation when you want to upload an entirely new entity, but you aren't sure whether it already exists. Utilisez cette opération lorsque vous n’avez aucun doute quant à la qualité de la nouvelle entité chargée, car celle-ci écrase complètement l’ancienne entité.Use this operation when you know that the newly uploaded entity is entirely correct because it completely overwrites the old entity. Vous souhaitez, par exemple, mettre à jour l’entité qui stocke l’emplacement actuel d’un utilisateur et ce, que l’application ait déjà stocké ou non des données d’emplacement pour cet utilisateur ; la nouvelle entité d’emplacement est complète et vous n’avez besoin d’aucune information d’une entité précédente.For example, you want to update the entity that stores a user's current location regardless of whether or not the application has previously stored location data for the user; the new location entity is complete, and you do not need any information from any previous entity.

Stockage de séries de données dans une même entitéStoring data series in a single entity

Parfois, une application stocke une série de données fréquemment nécessaires pour tout récupérer à la fois : par exemple, une application peut suivre l’utilisation du processeur au fil du temps pour tracer un graphique propagée des données à partir des dernières 24 heures.Sometimes, an application stores a series of data that it frequently needs to retrieve all at once: for example, an application might track CPU usage over time in order to plot a rolling chart of the data from the last 24 hours. Une méthode consiste à disposer d’une entité de table par heure, chaque entité représentant alors une heure donnée et stockant l’utilisation du processeur au cours de cette période.One approach is to have one table entity per hour, with each entity representing a specific hour and storing the CPU usage for that hour. Pour représenter ces données sur un graphique, l’application doit récupérer les entités qui contiennent les données des 24 dernières heures.To plot this data, the application needs to retrieve the entities holding the data from the 24 most recent hours.

Sinon, votre application peut stocker l'utilisation du processeur pour chaque heure sous la forme d'une propriété distincte d'une entité unique : pour mettre à jour chaque heure, votre application peut utiliser un seul appel InsertOrMerge Upsert pour mettre à jour la valeur de la dernière heure.Alternatively, your application could store the CPU usage for each hour as a separate property of a single entity: to update each hour, your application can use a single InsertOrMerge Upsert call to update the value for the most recent hour. Pour représenter les données sur un graphique, l’application doit récupérer une seule entité au lieu de 24, générant ainsi une requête efficace.To plot the data, the application only needs to retrieve a single entity instead of 24, making for an efficient query. Pour plus d’informations sur l’efficacité des requêtes, consultez la section intitulée Étendue des requêtes.For more information on query efficiency, see the section titled Query scope).

Stockage de données structurées dans des objets blobStoring structured data in blobs

Si vous effectuez des insertions par lot, puis récupérez des plages d’entités, utilisez des objets blob plutôt que des tables.If you are performing batch inserts and then retrieving ranges of entities together, consider using blobs instead of tables. Un fichier journal constitue un parfait exemple.A good example is a log file. Vous pouvez regrouper plusieurs minutes de journalisation et les insérer, puis récupérer plusieurs minutes de journalisation à la fois.You can batch several minutes of logs and insert them, and then retrieve several minutes of logs at a time. Dans ce cas, les performances sont meilleures si vous utilisez des objets blob plutôt que des tables, dans la mesure où vous pouvez réduire de manière significative le nombre d’objets écrits ou lus, ainsi que le nombre de requêtes qui doivent être effectuées.In this case, performance is better if you use blobs instead of tables, since you can significantly reduce the number of objects written to or read, and also possibly the number of requests that need made.

Étapes suivantesNext steps