SO Azureのストレージテーブルのtotal行数を取得する方法についてのさまざまな質問を見てきたが、行数を取得する方法を知りたい単一のパーティション内。
最小限のエンティティデータをメモリにロードしているときにこれをどのように行うことができますか?
既にご存じかもしれませんが、Azure TablesにはCount
のような機能はありません。パーティション(またはテーブル)内のエンティティ(行)の総数を取得するには、すべてのエンティティをフェッチする必要があります。
Query Projection
と呼ばれる手法を使用して、応答ペイロードを減らすことができます。クエリプロジェクションを使用すると、テーブルサービスが返すエンティティ属性(列)のリストを指定できます。エンティティの総数のみに関心があるため、PartitionKey
のみをフェッチすることをお勧めします。クエリプロジェクションについて理解するには、次のブログ投稿が役立ちます: https://blogs.msdn.Microsoft.com/windowsazurestorage/2011/09/15/windows-Azure-tables-introducing-upsert-and-query -projection / 。
これは、Azureテーブルストレージサービスのアトミックバッチ操作をかなり効率的に活用することで実現できます。すべてのパーティションには、同じパーティションキーと「PartitionCount」などの特定の行キーを持つ追加のエンティティがあります。そのエンティティには、1つのint(またはlong)プロパティCountがあります。
新しいエンティティを挿入するたびに、アトミックバッチ操作を実行して、パーティションカウンターエンティティのCountプロパティもインクリメントします。パーティションカウンターエンティティはデータエンティティと同じパーティションキーを持つため、一貫性が保証されたアトミックバッチ操作を実行できます。
エンティティを削除するたびに、パーティションカウンターエンティティのCountプロパティに移動してデクリメントします。繰り返しますが、これらの2つの操作は一貫しています。
パーティションカウントの値を読み取るだけの場合は、パーティションカウンターエンティティに対して単一のポイントクエリを実行するだけで、そのCountプロパティがそのパーティションの現在のカウントを通知します。
https://Azure.Microsoft.com/en-gb/features/storage-Explorer/ クエリを定義でき、[テーブル統計]ツールバー項目を使用して、全体の合計行を取得できますテーブルまたはクエリ
ストップウォッチを使用して、標準のTableEntityに加えて3つのフィールドを持つパーティション内の100,000のエンティティをフェッチおよびカウントする速度をテストしました。
PartitionKeyだけを選択し、リゾルバーを使用して文字列のリストだけを取得します。これは、パーティション全体が取得されたらカウントされます。
私が持っている最速はそれが6000ms
-6500ms
。これが関数です:
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;
}
これはジェネリック関数であり、必要なのはtableName
とpartitionKey
だけです。