2011-08-22 70 views
2

其中產生多條記錄我在C#編程的一個項目,需要存儲到數據庫中。目前我所做的(非常慢)是將所有這些結果存儲爲結構列表。然後在最後遍歷這個結構並將所有記錄添加到一個sql查詢字符串中。與此相關的問題是,當它包含100000個項目時,需要很長時間來遍歷列表。模擬中需要多次執行類似尺寸的插入。我已經考慮過從off存儲字符串,而不是將記錄存儲在列表中直接放入字符串中。也可以將它們存儲在臨時文件中並使用sql複製。我並沒有太多處理這些數據的經驗,因此您的反饋將得到讚賞。使用C#來生成並記錄100000s成Postgres數據庫

在此先感謝

+0

在這種情況下用於提高性能。在大多數驅動程序批處理實現IEnumerable ,更少IList 。所以,適當大小的列表應該有所幫助。你如何生成列表?一些代碼 –

+0

您是否使用StringBuilder構建查詢? – DenisPostu

+0

Postgres沒有BulkCopy類可用嗎? Sql Server和Oracle有 - 我在平庸的硬件上每秒鐘向SQL服務器插入大約75k條記錄。 – TomTom

回答

0

如果你有使用面向對象的方法低性能,因此使用結構/班,首先要做的,是衡量和優化的代碼儘可能。

如果性能即使經過優化您的特定背景下不好,我會離開的OOP方法,並傳遞到原始的SQL。

一個解決方案就可以了,就像你在帖子中說,代串爲每一個實體的過程中,立即將其添加到大的文件,在此,產生的結束,你會發現完整的龐大的SQL字符串。這裏的問題是解決方案的可測試性。

但是,你知道,冥冥之中你需要「付出」。在這樣的規模上,你不可能擁有一個現代化的表演。

1

你應該嘗試的一個填充文件,然後使用您的數據建立在COPY命令是什麼。這是填充數據庫的推薦方法。 http://www.postgresql.org/docs/8.3/interactive/sql-copy.html

構建CSV臨時文件時,請注意遵循CSV規範。如果您的列數據中包含新線(\ n \ r),逗號(,)或引號( 「),然後逃逸引號用引號

data=data.Replace("\"", "\"\""); 

(」),並用引號括數據

data="\""+data+"\""; 

喜歡的東西

public String CSVEscape(String columnData) 
{ 
    if(columnData.Contains("\n") || columnData.Contains("\r") || columnData.Contains("\"") || columnData.Contains(",")) 
    { 
     return "\"" + columnData.Replace("\"", "\"\"") + "\""; 
    } 
    return columnData; 
} 
1

如果我正確地讀你的問題,你要發送的PostgreSQL服務器,看起來像這樣的字符串:

INSERT INTO mytable (x, y, z) VALUES (1,2,3), (4,5,6), ... 

你應該做的,而不是爲

  1. 啓動事務
  2. 準備語句INSERT INTO mytable (x, y, z) VALUES ($1, $2, $3)
  3. 在你的列表中的每個結構,與 相應的字段
  4. 提交執行預備語句交易

(索爾ry,沒有代碼,因爲我不知道C#的數據庫API。)

我不會費心計算出COPY IN,除非我上面描述的方法仍然太慢。將數據插入數據庫時​​,我會感到緊張,因爲我需要任何類型的文本。