2012-11-05 54 views
4

我的目標是實現將數據庫中的數據塊複製到C函數中作爲查詢結果進行處理和返回的最高性能。使用C函數擴展PostgreSQL時實現高性能事務

我是PostgreSQL的新手,我目前正在研究移動數據的可能方法。具體而言,我正在尋找與PostgreSQL特別相關的細微差別或關鍵字來快速移動大數據。

注: 我的最終目標是速度,所以我願意接受,只要它得到很大的性能結果我提出的具體問題以外的答案。例如,我遇到了COPY關鍵字(僅限於PostgreSQL),該表將數據從表格快速移動到文件;反之亦然。我試圖遠離數據庫外部的處理,但如果它提供的性能改進超出了外部處理的明顯缺點,那就這麼做吧。

+0

你說的是在特定記錄上運行c函數,還是在表中的所有記錄上運行函數?另外,您想要處理的數據有多大?結果有多大? – Gary

+0

這張表擁有數百萬條記錄,在一個完美的世界裏,我會一次性轉換整個表格的一列。目前,函數每次調用都在一個記錄上運行,但是我想一次獲取多個(比如說1000,然後根據機會呈現自身或有意義的比例向上擴展),並一次對多個行執行操作。 – Zak

+0

請注意'COPY'只能將數據加載到*表*中,而不是函數。對於大多數人來說,將「複製」數據轉換成表格是有意義的,然後用函數對其進行處理。 –

回答

3

聽起來好像你可能想用server programming interface (SPI)來實現一個存儲過程,作爲在PostgreSQL後端運行的C language function

使用SPI_connect來設置SPI。

現在SPI_prepare_cursor查詢,然後SPI_cursor_open它。 SPI_cursor_fetch行,SPI_cursor_close完成。請注意,SPI_cursor_fetch允許您獲取批次的行。

SPI_finish清理完成後。

您可以在生成它們時將結果行返回到一個tuplestore,從而避免在內存中構建整個表。請參閱PostgreSQL源代碼中任何設置返回函數中的示例。你可能也想看看SPI_returntuple輔助函數。另外還有:C language functionsextending SQL

如果感興趣的最大速度,您的客戶可能希望通過libpqtypes使用libpq二進制協議,因此它會以最小的開銷接收服務器端SPI使用過程所產生的數據。

+0

爲了確定,我正在使用C語言函數(在數據庫中),我正在尋找通過C語言函數移動多行的最快方法,而不是逐行調用。 – Zak

+0

@Zak Yep,這可能是最快的方法。 SPI用於DB內部的C語言功能。這就像在DB中運行的C用戶定義過程的libpq一樣。帶批量光標讀取的SPI查詢很可能是你最好的選擇,除非你想直接掛鉤查詢執行程序(警告:可怕,有龍,不這樣做)。澄清最後一張牌,以清楚表明這僅僅是一邊,其餘的適用於服務器端/ spi。 –

+0

(+1) - 感謝您澄清,我正在閱讀有關它! – Zak