2016-03-28 2 views
0

問題に近づく方法を決定する際に問題があります。私たちは、Java jdbcプログラムと組み合わせてmonetDBを使用しています。スクリプトを書く必要がある場合や、JAVAで計算を行う必要がある場合は、SQLクエリを使用して問題を解決できるかどうか、いくつかのガイダンスをお願いします。複数のSQLテーブルからデータを抽出する最も効率的な手法

テーブル名に日付が付いた約3か月分のデータ(〜90個のテーブル)があります。各テーブルには、そのように簡略化された時系列の取引データが含まれています。

TableMarch1 
Time Symbol Vol 
9:30 X  100 
9:31 Y  200 
9:31 X  100 
... 
TableMarch2 
Time Symbol Vol 
9:30 X  500 
9:31 Y  300 
9:31 Y  100 
... 

マイタスク(すなわち(9〜15分間隔で一日の異なる期間中に活動を分析することである:30-9:45、9:45-10:00)テーブルが多くのシンボルを含んでいてもよいです

理想的には、各日付の各期間の各記号の合計音量を集計したいと思っていますが、データを結合して合計を後で計算することもできます。

Result table1(930-945) 
Date Time  Sym Total Volume 
March 1 9:30-9:45 X 200 
March 1 9:30-9:45 Y 300 
March 2 9:30-9:45 X 500 
... 
Result table 2(945-1000) 
March 1 9:45-10:00 X 1000 
March 1 9:45-10:00 Y 500 

結局、私はeacの統計計算を行うことができます1つのシンボルに対するh間隔。すべての日付テーブルからデータを取得し、タイムスライスに基づいて新しいビュー/テーブルを作成する効率的な方法があるかどうかは不明です。私は、JDBCを使ってこれらのテーブルをすべてテストしてクエリするだけで問題を解決することができますが、一度に90テーブルずつデータをクエリし、すべてのデータを15分のバケットに分割するのは非常に高価な処理ですそこから統計計算を行うので、このデータを効率化する新しい構造をデータベースに設定する必要があるように感じられるが、手動でデータを引き出すことなくこれを行う方法は不明だ各テーブルは一度に1つずつ表示されます。

単一のSQL文を使用して複数のテーブルからデータを取得して、何らかの方法でビューまたは新しいテーブルを作成することはできますか(基本的には、ケースに基づいて別のテーブルに挿入するケースステートメントを書く方法はありますか?これらのクエリをより効率的に実行するようにmonetdbを設定する方法はありますか?または、一度に1つのテーブルを処理し、すべてを新しいテーブルにプルするスクリプトを作成する必要はありますか?

+1

私はMonetDBを使ったことはありませんが、基盤となるストレージと検索のメカニズムが(MonetDBのような)列指向であるか(より伝統的なDBMSのような)行指向であるかにかかわらず、あなたのデータが日付ごとに別々のテーブルで断片化されている場合、大きな迷惑になります。私はあなたの人生を楽にするために失敗する可能性がある各レコード(または "観察"、またはあなたが選んだ言葉)の日付*値*を持つ1つの大きなテーブルにデータをどのように統合するのか想像するのが難しいです。 –

+0

ゴード、私は考えていたが、テーブルは大きすぎるので、1日に約30列と約3,500万〜6GBのレコードがある。私は毎週のテーブルにテーブルを結合して、約200mのレコードに達し、残念ながら256gbのメモリを搭載した重い32コアサーバーであっても、複数の日付からデータを照会すると、最終的な目標は、履歴分析を同じデータのリアルタイムフィードと組み合わせて、より複雑なソリューションが含まれていても、レイテンシとコストを削減することが優先事項です。 – Gadesxion

答えて

0

データ構造の複雑さを隠すために、SQLビューとユニオンの組み合わせを使用して、時間の経過とともにデータを一元的に表示できます。

SQL Group By述部を使用すると、データをタイムスライスで集計できます。

SELECT LEFT(Time, 13) AS Period, Symbol, AVG(Value) 
    FROM ViewMarch 
    GROUP BY Period, Symbol; 

:あなたは、その後のようなクエリを使用して、例えば、時間あたりの平均シンボル値を計算することができ

CREATE TABLE TableMarch1(Time timestamp, Symbol integer, value integer); 
CREATE TABLE TableMarch2(Time timestamp, Symbol integer, value integer); 

CREATE VIEW ViewMarch AS 
    SELECT Time, Symbol, Value FROM TableMarch1 
    UNION 
    SELECT Time, Symbol, Value from TableMarch2; 

:あなたの例を考えると

、あなたは以下のように定義ビューViewMarchを持っているでしょうしかし、パフォーマンスのコストに注意してください。私は、MonetDBがどのようにユニオンに対するクエリを最適化するのか分かりません。

関連する問題