2016-11-01 6 views
1

のパフォーマンスの向上:私はAzureのテーブルの上に次のクエリを持って、このAzureのテーブルの行数クエリ

var count = table.ExecuteQuery(new TableQuery<MessageEntity>()).Count(); 

これはMessageEntityです:

public class MessageEntity : TableEntity 
{ 
    public MessageEntity() { } 

    public string Message { get; set; } 
} 

このクエリが本当に遅いです。私の開発マシンで合計85,000レコードを数えるのに約15秒かかります。私はAzure Storage EmulatorUseDevelopmentStorage=trueを接続文字列として使用しています。もっとパフォーマンスを向上させるために私は何ができますか?私がしようとしているのは、レコードの数を数えることだけです。確かに高速な方法が必要ですか?

答えて

2

AzureテーブルのLINQサポートが限定されており、Countは現在サポートされていません(List of supported LINQ operators)。

var count = table.ExecuteQuery(new TableQuery<MessageEntity>()).Count(); 

上記の表からすべてのエンティティをフェッチしているコード(一度に1000のエンティティまで)と、あなたのテーブルで20000個のエンティティを持っているので、それはAzureのテーブルに少なくとも20個の要求を行っています。各リクエストはAzure Tables REST APIに対するHTTPリクエストであるため、これは非常に時間がかかることがわかります。実際のストレージアカウントからテーブル内のエンティティの数を取得しようとすると、これはさらに悪化します。

時間を短縮できる方法の1つは、ネットワーク経由で転送されるデータ(特に応答データ)を減らすことです。現在、エンティティのすべてのプロパティは応答データの一部として返されます。総カウントにのみ関心があるので、Query Projectionを使用し、返信で1つのプロパティ(例:PartitionKeyまたはRowKey)を返すことができます。そうすれば、あなたの応答データはあなたが現在持っているものよりもずっと小さくなり、時間がいくらか削減されるはずです。

知っている数が本当に重要な場合は、いくつかのバックグラウンドプロセスでカウントを計算し、それを別のテーブルで更新することもできます。

1

Azureテーブルストレージにはカウント機能はありません。あなたの質問で実際に起こっていることは、すべてのレコードを取り戻し、それらを1つずつ列挙しているということです。

ご利用いただけるオプションがありますが、ここで提案できるものは、組み込み機能を活用するものではありません。あなたは自分でカウンタを維持することができますが、あなたのメインテーブルの両方に原子番号で書かなければなりません。あなたのカウンタを書き込み、削除します。これは非常に簡単に狂っていることがわかります。

テーブルストレージは、パーティションキーと行キーで構成されるクラスタ化キーを持つキー値ペアストアです。それはかなりです。集計機能が必要な場合は、DocumentDB(いくつかの集約関数のみが実装されていますが)やSQL Azureを参照することをお勧めします。

0

ここでは、エンティティを取得せずに、空白のテーブル内の単一パーティションのエンティティ数を取得する方法を示します。各パーティションに対して、追加のエンティティを1つ作成し、同じパーティションキーでも定数行キー(つまり、 "rowcountRK")を使用して行カウントエンティティと呼ぶことができます。行数エンティティは、1つのlong型プロパティ、つまり1つのlong型プロパティを持ちます。そのパーティションの行数を保持する "rowCount"。

エンティティをそのパーティションに挿入するたびに、そのパーティションの行数エンティティのrowCountプロパティもインクリメントします。そして、あなたはバッチ操作でそれを行います。Azureテーブルのバッチ操作は、同じパーティション内のアトミックなので、矛盾はありません。同様に、パーティションからエンティティを削除したり、エンティティを削除するたびに、行数エンティティのrowCountプロパティを減らし、一貫性とアトミシティのためにバッチ操作内のこれらの操作をAzureテーブルストレージに再度送ります。

ここで、1つのパーティション内の行数を照会する必要がある場合は、そのパーティションの行数エンティティを照会し、他のものを検索/スキャンする必要はありません。テーブル全体に行の総数を取得する場合は、テーブルに複数のパーティションがあると仮定すると、テーブル内のすべての行数エンティティにクエリを行い、その行カウントプロパティ値をクライアント上で合計する必要があります側。これはテーブルスキャンの原因になりますが、ペイロードは小さくなりますが、おそらくテーブル全体をスキャンするよりも速くなります。

関連する問題