イベント ログとして機能する Azure テーブルがあります。テーブルの下部を読み取って最新のエントリを取得する最も効率的な方法が必要です。
これを行う最も効率的な方法は何ですか?
イベント ログとして機能する Azure テーブルがあります。テーブルの下部を読み取って最新のエントリを取得する最も効率的な方法が必要です。
これを行う最も効率的な方法は何ですか?
まず最初に、UTC ティックに基づいてパーティション キーを作成することをお勧めします。すべてのアンチティが最新のものから古いものへと並べられるようにすることができます。
次に、100 個の最新のログを取得したい場合は、呼び出すだけです (クエリがお気に入りのクライアントからの IQueryable であるとしましょう。Lucifure Stash を使用します): query.Take(100);
特定の期間エンティティをフェッチする場合は、次のように記述します。 query.Where(x => x.PartitionKey <= value); または似たようなもの。
「値」変数は、パーティション キーの値を作成する方法に基づいて作成する必要があります。
Microsoft は、Azure Table にログを記録するための特定のシンクを持つSemanticLoggingフレームワークを提供しています。
ライブラリ コードを見ると、 Datetime に基づいて (逆の順序で) パーティション キーが生成されます。
static string GeneratePartitionKeyReversed(DateTime dateTime)
{
dateTime = dateTime.AddMinutes(-1.0);
return GetTicksReversed(
new DateTime(dateTime.Year, dateTime.Month, dateTime.Day, dateTime.Hour, dateTime.Minute, 0));
}
static string GetTicksReversed(DateTime dateTime)
{
return (DateTime.MaxValue - dateTime.ToUniversalTime())
.Ticks.ToString("d19", (IFormatProvider)CultureInfo.InvariantCulture);
}
そのため、アプリケーションに同じロジックを実装して、パーティション キーを作成できます。
特定の日付範囲のログを取得する場合は、次のようなクエリを記述できます。
var minDate = GeneratePartitionKeyReversed(DateTime.UtcNow.AddHours(-2));
var maxDate = GeneratePartitionKeyReversed(DateTime.UtcNow.AddHours(-1));
// Get the cloud table
var cloudTable = GetCloudTable();
// Build the query
IQueryable<DynamicTableEntity> query = cloudTable.CreateQuery<DynamicTableEntity>();
// condition for max date
query = query.Where(a => string.Compare(a.PartitionKey, maxDate,
StringComparison.Ordinal) >= 0);
// condition for min date
query = query.Where(a => string.Compare(a.PartitionKey, minDate,
StringComparison.Ordinal) <= 0);3
最新の「n」個のエントリをフェッチする場合は、PartitionKey と RowKey の値を少し変更する必要があります。これにより、最新のエントリがテーブルの一番上にプッシュされます。
このためDateTime.MaxValue.Subtract(DateTime.UtcNow).Ticks;
には、DateTime.UtcNow の代わりに使用して両方のキーを計算する必要があります。