web-dev-qa-db-fra.com

Compter les lignes de la partition dans le stockage de la table Azure

J'ai vu diverses questions concernant SO sur l'obtention du nombre de lignes total d'une table de stockage Azure, mais je souhaite savoir comment obtenir le nombre de lignes d'une partition.

Comment puis-je faire cela en chargeant une minimale quantité de données d'entité en mémoire?

8
goelze

Comme vous le savez peut-être déjà, aucune fonctionnalité semblable à Count n'est disponible dans les tables Azure. Pour obtenir le nombre total d'entités (lignes) dans une partition (ou une table), vous devez extraire toutes les entités.

Vous pouvez réduire la charge de réponse en utilisant une technique appelée Query Projection. Une projection de requête vous permet de spécifier la liste des attributs d'entité (colonnes) que vous souhaitez que le service de table renvoie. Puisque vous ne vous intéressez qu'au nombre total d'entités, je vous recommanderais de ne récupérer que PartitionKey. Ce billet de blog peut vous être utile pour comprendre Query Projection: https://blogs.msdn.Microsoft.com/windowsazurestorage/2011/09/15/windows-Azure-tables-introducing-upsert-and-query-projection/ .

13
Gaurav Mantri

Vous pouvez y parvenir en tirant parti du fonctionnement par lots atomique du service de stockage sur table Azure de manière assez efficace. Pour chaque partition, une entité supplémentaire avec la même clé de partition et une clé de ligne spécifique telle que "PartitionCount", etc. Cette entité aura un seul compte de propriété int (ou long).

Chaque fois que vous insérez une nouvelle entité, effectuez une opération atomique par lots afin d'incrémenter également la propriété Count de votre entité de compteur de partitions. Votre entité de compteur de partition aura la même clé de partition que votre entité de données, ce qui vous permet d'effectuer une opération de traitement par lots atomique avec une cohérence garantie.

À chaque fois que vous supprimez une entité, décrémentez la propriété Count de l'entité compteur de partitions. De nouveau dans une opération d’exécution par lots, ces 2 opérations sont cohérentes.

Si vous souhaitez simplement lire la valeur du nombre de partitions, il vous suffit d'effectuer une requête en un seul point auprès de l'entité de compteur de partitions. Sa propriété Count vous indiquera le nombre actuel de partitions.

3
Dogu Arslan

https://Azure.Microsoft.com/en-gb/features/storage-Explorer/ vous permet de définir une requête et vous pouvez utiliser l'élément de la barre d'outils Statistiques de la table pour obtenir le nombre total de lignes pour la table entière ou votre question

 enter image description here

1
Nigel Belham

Testé la vitesse à l'aide de Chronomètre pour extraire et compter 100 000 entités dans une partition comportant trois champs en plus de la norme TableEntity.

Je sélectionne seulement la PartitionKey et j'utilise un résolveur pour me retrouver avec une simple liste de chaînes que, une fois que la partition entière a été récupérée, je compte.

Le plus rapide que je connaisse est autour de 6000ms - 6500ms. Voici la fonction:

public static async Task<int> GetCountOfEntitiesInPartition(string tableName, string partitionKey)
    {
        CloudTable table = tableClient.GetTableReference(tableName);

        TableQuery<DynamicTableEntity> tableQuery = new TableQuery<DynamicTableEntity>().Where(TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, partitionKey)).Select(new string[] { "PartitionKey" });

        EntityResolver<string> resolver = (pk, rk, ts, props, etag) => props.ContainsKey("PartitionKey") ? props["PartitionKey"].StringValue : null;

        List<string> entities = new List<string>();

        TableContinuationToken continuationToken = null;
        do
        {
            TableQuerySegment<string> tableQueryResult =
                await table.ExecuteQuerySegmentedAsync(tableQuery, resolver, continuationToken);

            continuationToken = tableQueryResult.ContinuationToken;

            entities.AddRange(tableQueryResult.Results);
        } while (continuationToken != null);

        return entities.Count;
    }

Ceci est une fonction générique, tout ce dont vous avez besoin est tableName et partitionKey.

1
NickBrooks