2016-05-12 6 views
0

私は約25-30万行と15列のテーブルを持っています。 これらのほとんどは静的であるか、リアルタイム更新を取得します。 しかし、いくつかの列(3から4)では、hdfsからのデータを1日に1回取得して更新します。つまり、これらの列は1日に1回更新する必要があります。毎日3000万レコードのテーブルで3-4列を更新する最も良い方法

私はhdfsの出力から新しいテーブルを作成してメインテーブルの結合を試みましたが、それは永遠にかかるようです。 バッチ更新をやってみましたが、あまりにも長くかかるようです。

これを行うにはどのような方法が最適ですか?

私は、更新/挿入クエリのパフォーマンスを向上させるために

+2

データを更新する場合は、まず使用しているデータベースを決定し、質問に適切なタグを付けます。無関係のデータベースタグを削除しました。 –

+0

@GordonLinoffがquesionを編集しました。他のリレーショナルDBにタグを付けて、同様の経験を持ち、ポストグルではなく他のrdbmsを使用している人にも入力できるようにしてください。 – Peter

+0

@Peterの問題とその解決策はRDMSに特有の傾向がありますが、他のDBにも役立ちます。 generecソリューションをすべて使用するには、sqlタグを使用します。すべての人にとって「最良の方法」を見つけるのも不可能です。 – Alex

答えて

2

最良の方法は、一括挿入を使用している/

を更新し、私のデシベルとしてはpostgresを使用しています以下の記事をご覧に役立ちます持ってください。あなた:

MySQL bulk INSERT or UPDATE

Does splitting up an update query improve performance

+0

誰もがこの答えを下降させる前に、元の質問には想像できるSQLタグが付いていたので、当時は公正な答えでした(リンクされたページからの引用がそれをより良くしたはずです)。 – e4c5

+0

バッチ更新でさえ問題が非常に非常に長いです。 – Peter

0

私は、古いテーブルを更新するのではなく、新しいテーブルとバッチデータを使って作成しているテーブルの間の結合を使って、CREATE TABLE AS ...コマンドを使って新しいテーブルを作成するようなことを試みます。

http://www.postgresql.org/docs/9.4/static/sql-createtableas.html

あなたはトランザクション内で、あなたが関数内に置くことができ、その後、あなたがちょうどそれらを切り替えるために、テーブルの名前を変更するか、単に古いものを削除して新しい名前を変更できることを配置した場合。

私は、この戦略がバッチジョブのクロックのように機能するプロセスを見てきました(古いものを更新するよりも早く新しいテーブルを作成する)。

あなたはそれをテストし、それがあなたのテーブルに合っているかどうかを見て、あなたが持っているインデックスを見る必要があります。

運が良かった!

注:インデックスと制約を新しいテーブルに作成テーブルとして追加する必要もあります。

+0

私はこれらの2つのテーブルの上に更新可能なビューを作成しました。これはうまくいくようです。 – Peter

関連する問題