2011-07-29 10 views
0

私は膨大なデータベース(2.1十億行)を持っており、いくつかの統計結果を抽出するために何らかの計算を実行する必要があります。私の理解では、このデータベースで直接計算を行うのは賢明ではないことは明らかです。メモリに結果クエリをロードする方法はありますか?

今私がしようとしているのは、テーブルの一部をメモリにロードすることです(100万行という)。私は行ごとに反復せずに、ResultSetのデータの全体のチャンクをメモリにロードする方法がわかりません。

+5

「私の理解では、このデータベースで直接計算を行うのは賢明ではないことは明らかです。」計算によって異なります。 – Jacob

+0

私はJacobに同意します:あなたの理解は間違っています。これはまさにリレーショナルDBMSの意味です。 –

答えて

7

逆に、このデータベースに直接

を計算を実行するのが賢明ではないことは明らかだが、データベースにそれをやってはそれを行うための最も賢明な方法である可能性が非常に高いです。データベースは、大量のデータを処理するために正確に構築されています。あなたの計算をSQLクエリとして表現することができれば、データベースはそれを効率的に実行する方法を考え出します。一般に、これは、すべてのデータをメモリにロードして自分で処理した場合よりもはるかに迅速に実行されます。

これは例ではない場合があります - グラフ解析など - いくつかの種類の計算がありますが、これはデフォルトの方法です。

+0

完全に同意すると、データ操作は通常、データベースによってより良く処理されます。ほとんどの場合、データベースで事前計算してから結果を照会するのが最も良い方法です。 – jasalguero

0

なぜ結果セットの反復処理に問題がありますか?実際のデータを大量のチャンクで取得したい場合(データベースへのネットワークラウンドトリップを防ぐなど)、結果セットのフェッチサイズを設定して、JDBCドライバが大量のデータを取得できるようにすることができます。

0

私は前回の回答に同意して、そのような量をメモリにロードするのは良いとは限りません。 しかし、あなたの質問に答えるには、ResultSetの切断表現のためのクラスがあります:javax.sql.RowSet

+0

接続を解除しても、中間層のすべてのRAMの問題は解決されません。 – duffymo

0

だけのデータベース上で行うことができる計算を行うために、中間層にデータベースから数百万行を移動、私には意味がありませんまったく。データベースでこれを実行する必要があります。プロトタイプを作成し、データがあなたの偏見を落とすことを確信しているかどうかを確認します。

+0

オクラホマ私はデータにもっと具体的になります、私は日付フィールドがあります。私は週と時間の曜日にいくつかの統計を実行する必要があります。例えばmondayには百万のレコードなどがあります。私はこの部分を小さな部分と複数のスレッドで実行できると思います。結局、私はすべての結果をまとめます。 –

0

あなたがしたいことは、OLAP (Online Analytical Processing)と呼ばれます。多くのRDBMSには、Oracle Analytic Functionsなどの機能を計算するための機能が豊富に用意されています。計算を単一のSQLクエリで実行できない場合は、ジョブを実行するストアドプロシージャを記述できます。

しかし、いくつかのデータベースからテラバイトのデータを読み込まないでください。ちょうどデータストアで実行できる計算をしてください。どうして?データの読み込みと転送に99%、計算に1%を使用します。

関連する問題