2017-06-30 4 views
1

私は、azureテーブルストレージにセンサ出力データを格納するためのベストプラクティスを検索しましたが、最良の答えは得られませんでした。私は現在、azureテーブルストレージにセンサーデータを格納することからなるプロジェクトに取り組んでいます。現在、Sensor IDとしてパーティションキーを使用しています。毎秒センサー出力を保存しています。現在、約100台のセンサーが使用されています。大容量のデータが毎日保存されていることを想像してください。だから、特定のセンサーデータを日付別に検索すると、Webアプリケーションのパフォーマンスが低下します。 Webアプリケーションのパフォーマンスを改善する良い方法はありますか?パーティションキーとしてセンサーIDを日付に変更するのはどうですか?コードはここでは重要ではありません。私はUPDATEセンサーの出力データを格納するために、紺碧テーブルストレージにパーティションキーを作成する最も良い方法は何ですか?

各センサが出力日時である10種類の出力と日付を提供

...論理的な解決策を必要とする。..この質問できるようなシナリオに取り組んでいる多くの開発者を支援します。だから彼らは各センサーIDの同じ行にあります。ここ日時、10の出力列と出力日付

は私のコード

var query = TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, sensorID); 
var dateFilter = TableQuery.CombineFilters(
      TableQuery.GenerateFilterConditionForDate("outputdate", QueryComparisons.GreaterThanOrEqual, Convert.ToDateTime(from)), 
      TableOperators.And, 
      TableQuery.GenerateFilterConditionForDate("outputdate", QueryComparisons.LessThanOrEqual, Convert.ToDateTime(to)) 
      ); 
      query = TableQuery.CombineFilters(query, TableOperators.And, dateFilter); 
var rangeQuery = new TableQuery<TotalizerTableEntity>().Where(query); 

     var entitys = table.ExecuteQuery(rangeQuery).OrderBy(j => j.date).ToList(); 

outputdateが出力を示している - センサID、のrowKey - そして私は

パーティションキーを日付の範囲を使用してセンサデータを取得し、センサIDいます発生した時間。これはdatetimeとして取得しています。すべての出力に同じ出力時間があります。

+1

あなたの質問を以下のように更新してください。1)PartitionKeyとRowKeyを選択するための現在のデザインは何ですか?つまり、テーブルに格納されている現在の値は何ですか?2)データのクエリ方法を教えてください。可能なすべてのクエリシナリオを一覧表示してください。ありがとう! –

+0

どのようなrowkeyを使用しますか? –

+0

行のキーはdatetime –

答えて

2

まず、Azure Storage Table Design Guide: Designing Scalable and Performant Tablesとお読みください。これにより、データをどのように構造化するかについて多くのアイデアが得られます。

今現在の実装になります。私が気づいているのは、クエリにPartitionKey(これは非常に良い)が含まれているが、インデックスにはない属性(outputdate)もクエリに追加されているということです。これにより、既知のものがPartition Scanになります。テーブルが大きい場合は、outputdateという属性にマッチするようにクエリ全体がスキャンされるため、問題が発生します。

datetimeの値がRowKeyであると述べました。 RowKeyの値がoutputの値と一致すると仮定すると、このインデックスされていない属性の代わりにRowKeyを使用することをお勧めします。 RowKeyPartitionKey)は、テーブル内で索引付けされる唯一の2つの属性であるため、問合せは比較的高速です。

日付/時刻をRowKeyとして保存する場合は、日付/時刻の値を文字列に変換するのではなく、ダニ(DateTime.Ticks)に変換して保存することをお勧めします。この方法を使用する場合は、このティックの前に0を前に付けることをお勧めします。これにより、すべての値が同じ長さ(DateTime.Ticks.ToString("d19")など)になります。

RowKeyReverse Ticks、つまり(DateTime.MaxValue.Ticks - DateTime.Ticks).ToString("d20")と保存することもできます。これにより、最新のエントリがすべてテーブルの最上部に追加されるようになります。これは、最新のレコードを照会することにもっと関心のあるシナリオに役立ちます。

特定のセンサーを常に照会する場合は、各センサーのデータを別々のテーブルに保存しても問題ありません。つまり、各センサーは別のテーブルを取得します。これにより1つの鍵が解放されます。現在、RowKeyとして保存している日付/時刻の値はPartitionKeyとなり、その他の値はRowKeyとして使用できます。さらに、ストレージアカウント間で拡張することができます。一部のセンサーのデータは1つのストレージアカウントに格納され、他のセンサーのデータは他のストレージアカウントに格納されます。データが正しいストレージアカウント/テーブルに到達するように、この関係を保存する必要があるのはどこかです。

+0

良い解答をいただきありがとうございます。現在の状況では、すべてのセンサデータを1つのテーブルに格納する必要があります。出力日時とRowKeyの瞬間が異なる可能性があるので、RowKeyを使用することはできません。 –

関連する問題