私はPostgreSQLデータベースへのログファイル用にETLをやっており、単純なスタースキーマにデータを読み込む際のパフォーマンスを最適化するために使用されるさまざまなアプローチについてもっと学びたいと思っています。SQL - バルクインサートと大きな結合のパフォーマンスを最適化しますか?
文脈で質問を置くためには、ここで私は現在、何をすべきかの概要です:
- ドロップすべての外部キーとユニーク 制約
- インポートしたデータ(約100万件のレコード)
- 再制約を作成し、ファクト表の分析を実行します。
データの読み込みは、ファイルからの読み込みによって行われます。
1)コピーを使用して一時テーブルにデータをロードする(PostgreSQLの一括アップロードツール)
2)任意の新しいデータがそのような各のためのインサートを用いて9次元テーブルの各々を更新:各ファイルについてよう:
INSERT INTO host (name)
SELECT DISTINCT host_name FROM temp_table
EXCEPT
SELECT name FROM host;
ANALYZE host;
分析する(アップデートの数千万の過程で最新の統計を保つためのアイデアをINSERTの最後に実行このことをお勧めまたは必要です最低でもそれはないですか?性能を大幅に低下させるように見える)。
3)ファクトテーブルは、不浄9ウェイで更新されて参加:私が見渡せるんだが、より良いアプローチは
INSERT INTO event (time, status, fk_host, fk_etype, ...)
SELECT t.time, t.status, host.id, etype.id ...
FROM temp_table as t
JOIN host ON t.host_name = host.name
JOIN url ON t.etype = etype.name
... and 7 more joins, one for each dimension table
ていますか?あなたは(あなたがそれを挿入した後)にデータを挿入しているが、あなたはが離れてこの情報を投げると、あなたとステージ3でそれを再発見している各次元の主キーを知っているステージ2の間に
私は原則として同意しますが、私がそのアプローチを試みたとき、私はそれが平均で50%遅くなることを発見しました。ディメンションテーブルのキャッシングと、バルク操作(個々の選択/挿入ではなく)が高速であるため、すべてを実行するように見えます。 – Rob
@Rob:それは過去に私のために働いたアプローチのように面白いです。 BTW私はこの答えが何のコメントもせずにdownvotedと信じられない! – Adamski