2016-04-01 13 views
2

大規模なデータセット(Azure Blob)があり、数千のレコードがロードされた後、モデルのリフレッシュがかなり遅くなることに気付き始めました。大きなデータテーブルのクエリ

当社の現在のクエリの構造は次のとおりです。

#"Load Data" 
    Loads data from the Azure Blob, ~1000 files 
    Parses the files into a table with 3 columns (of list/record types which can be further expanded), ~700k rows 

#"Sessions" 
    Reference #"Load Data" 
    Expand all 'Session' related columns 

#"Users" 
    Reference #"Load Data" 
    Expand all 'User' related columns 

#"Events" 
    Reference #"Load Data" 
    Expand all 'Event' related columns 

#"Events By Name" 
    Reference #"Events" 
    Groups by 'event.name'- generates a column of tables to each event type's events and properties (these vary between events) 

#"Event Name1" (2, 3, etc. one table per event type) 
    Reference #"Events by Name" 
    Expands that event name's Table, and generates a table with event.id and each of the properties for that event type 

これを実行すると、リソースモニターを見ながら、メモリ使用量は、屋根を通過し、最終的にはディスク使用量につながるハード障害のトン。クエリ実行ポップアップを見てみると、一連のクエリがキックオフされ、並行して実行されるようです。

ローカルフォルダからデータを読み込むと、データをフェッチしてファイルを参照し、参照された共通クエリを並列に読み込むように見えます。私はこれが、メモリ使用量がひどくなること、ディスクをキックすること、クエリを実行するのに時間がかかることだと思います。

参照されたクエリが最初に一度実行され、その結果のテーブルがそれを使用する個々のクエリによって参照されると仮定しましたが、そうではありません。また、# "Load Data"と# "Events"の最後のステップとしてTable.Bufferを使用してみました。これらのクエリを一度計算してから扶養家族に分けて共有しようとしましたが、それは悪化させるように思えました。方法があります。

  • は、クエリは一度だけ実行してくださいは、それが並列に実行されているから、それを
  • 防止クエリを参照する任意のクエリを楽しみに渡された結果だ持っている、と順次代わり

アムを実行します私はちょうどこれを間違った方法で見ていますか?たくさんの「パフォーマンス」記事私はクエリー折りたたみを可能にするためにあなたのクエリーを構造化することしか言及していませんでした。 Azure Blobストレージは実際にローカルBLOBファイルを格納し、ローカルにロードして解析する必要があるため、これは現在のケースでは可能性がありません。

現在の700kテストイベントでこれらのクエリを実行するのは本当に苦労しており、実際の環境では数百万に達すると期待しています。ブロブを処理してデータをSQLデータベースにプッシュし、その代わりにモデルをリンクする唯一のオプションはありますか?

答えて

0

まずデータを処理してDBのテーブルに格納し、このテーブルをモデルのデータソースとして使用します。スケジュールされた間隔で実行されるジョブを実行してソース表のデータをリフレッシュし、表を更新します。

関連する問題