webentwicklung-frage-antwort-db.com.de

Zählen Sie die Zeilen in der Partition im Azure-Tabellenspeicher

Ich habe verschiedene Fragen zu SO zum Abrufen der total - Zeilenzahl einer Azure-Speichertabelle gesehen, möchte jedoch wissen, wie die Anzahl der Zeilen in einer einzelnen Partition ermittelt wird.

Wie kann ich dies tun, während eine minimale Menge von Entitätsdaten in den Speicher geladen wird?

8
goelze

Wie Sie vielleicht bereits wissen, gibt es in Azure Tables keine Count ähnliche Funktionalität. Um die Gesamtzahl der Entitäten (Zeilen) in einer Partition (oder Tabelle) zu erhalten, müssen Sie alle Entitäten abrufen.

Sie können die Antwortnutzlast mithilfe einer Technik namens Query Projection reduzieren. In einer Abfrageprojektion können Sie die Liste der Entitätsattribute (Spalten) angeben, die der Tabellendienst zurückgeben soll. Da Sie nur an der Gesamtzahl der Entitäten interessiert sind, würde ich empfehlen, dass Sie nur PartitionKey zurückholen. Dieser Blog-Beitrag ist möglicherweise hilfreich für das Verständnis der Abfrageprojektion: https://blogs.msdn.Microsoft.com/windowsazurestorage/2011/09/15/windows-Azure-tables-introducing-upsert-and-query-projection/ .

13
Gaurav Mantri

Sie können dies erreichen, indem Sie den atomaren Stapelbetrieb des Azure-Tabellenspeicherdiensts recht effizient einsetzen. Für jede Partition gibt es eine zusätzliche Entität mit demselben Partitionsschlüssel und einem bestimmten Zeilenschlüssel wie "PartitionCount" usw. Diese Entität hat eine einzelne int (oder long) -Eigenschaft Count.

Führen Sie jedes Mal, wenn Sie eine neue Entität einfügen, eine atomare Batch-Operation aus, um auch die Count-Eigenschaft Ihrer Partitionszähler-Entität zu erhöhen. Ihre Partitionszählerentität verfügt über denselben Partitionsschlüssel wie Ihre Datenentität, sodass Sie einen atomaren Batch-Vorgang mit garantierter Konsistenz ausführen können.

Wenn Sie eine Entität löschen, dekrementieren Sie die Count-Eigenschaft der Partitionszähler-Entität. Führen Sie in einem Stapelvorgang erneut einen Vorgang aus, damit diese beiden Vorgänge konsistent sind.

Wenn Sie nur den Wert der Partitionsanzahl lesen möchten, müssen Sie lediglich eine Einzelpunktabfrage an die Partitionszähler-Entität durchführen. Die Count-Eigenschaft gibt Ihnen dann die aktuelle Anzahl für diese Partition an.

3
Dogu Arslan

https://Azure.Microsoft.com/en-gb/features/storage-Explorer/ ermöglicht Ihnen das Definieren einer Abfrage und Sie können das Symbolleistenelement "Tabellenstatistik" verwenden, um die Gesamtzahl der Zeilen für die gesamte Tabelle oder Ihre zu erhalten Abfrage

 enter image description here

1
Nigel Belham

Getestet die Geschwindigkeit mit Stoppuhr, um 100.000 Entitäten in einer Partition abzurufen und zu zählen, die zusätzlich zu der Standard-TableEntity drei Felder aufweisen.

Ich wähle nur den PartitionKey aus und verwende einen Resolver, um nur eine Liste von Strings zu erhalten, die ich zähle, sobald die gesamte Partition abgerufen wurde.

Am schnellsten ist es um 6000ms - 6500ms. Hier ist die Funktion:

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;
    }

Dies ist eine generische Funktion. Sie benötigen lediglich die tableName und die partitionKey.

1
NickBrooks