Postgresql
在 postgresql 中將 50K 記錄插入大表(應用程序。350 列)
使用
C#
我正在嘗試從 csv 文件(約 55000 條記錄)插入到postgresql
具有 350 列的表中。我只是從逗號分隔的標題和記錄中建構 upsert 語句。像這樣:INSERT INTO public.table(field1,fields2,field3, ..... ,field350) VALUES(?,?,?,?,?,.......,?) ON CONFLICT(field1) DO UPDATE SET ...; INSERT INTO public.table(field1,fields2,field3, ..... ,field350) VALUES(?,?,?,?,?,.......,?) ON CONFLICT(field1) DO UPDATE SET ...; INSERT INTO public.table(field1,fields2,field3, ..... ,field350) VALUES(?,?,?,?,?,.......,?) ON CONFLICT(field1) DO UPDATE SET ...; INSERT INTO public.table(field1,fields2,field3, ..... ,field350) VALUES(?,?,?,?,?,.......,?) ON CONFLICT(field1) DO UPDATE SET ...; ....etc
我知道
bulk insert Copy operation
這給了我非常好的插入性能,但如前所述,我需要執行 upserts,但無論如何我都找不到使用這個COPY
東西來執行這些 upserts。此外,我不能執行這些,
transcations
因為我們想逐行檢查,如果一行失敗,我們不想讓整個過程失敗,而是記錄異常並繼續下一行。使用 a
stored procedure
也不起作用,因為我們擁有的大量列 (350) 超過了允許的 (100)。我
C# script
在 2 分鐘內達到 50K,我知道這可以優化。那麼有什麼有效的方法可以推薦給我嗎?
一些建議:
使用準備好的語句。這將加快執行速度,因為不必每次都計劃語句。
使用保存點。這樣,您可以擁有一個大事務並且仍然可以從錯誤中恢復:
- 每 100 行左右設置一個保存點。
- 如果一行失敗,則回滾到保存點並重做直到失敗行的所有內容,然後跳過該行並開始一個新的保存點。如果您有很多錯誤,最好少於 100 行,這樣您就不必重做太多工作。但是為每一行設置一個保存點也不利於性能。
COPY
數據到一個臨時表,然後INSERT INTO finaltable SELECT * FROM temptable ON CONFLICT ...;