我正在做日誌文件的ETL到PostgreSQL數據庫,並且想了解更多關於用於優化將數據加載到簡單的星型模式中的性能的各種方法。SQL - 優化批量插入和大型連接的性能?
擺在上下文中的問題,下面是我目前做一個概述:
- 刪除所有外鍵和唯一 約束
- 導入數據(約100萬條記錄)
- 回覆 - 創建約束並在事實表上運行分析。
導入數據是通過從文件加載完成的。對於每一個文件:
1)利用COPY從數據加載到臨時表(PostgreSQL的大量上傳工具)
2)更新每個9代維表的使用的插入對於每個這樣的任何新的數據如:
INSERT INTO host (name)
SELECT DISTINCT host_name FROM temp_table
EXCEPT
SELECT name FROM host;
ANALYZE host;
的Analyze在擁有超過千萬的更新的過程中保持統計最新(的想法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
是否有更好的方法我俯瞰?
我原則上同意,但是當我嘗試這種方法時,我發現它平均慢了50%。它看起來像維度表的緩存結合做大量操作(而不是單獨的選擇/插入)更快。 – Rob 2009-08-05 19:19:20
@Rob:這很有趣,因爲它是一種過去爲我工作的方法。順便說一句,我不能相信這個答案沒有任何評論downvoted! – Adamski 2009-08-12 09:52:34