4

私の目標は、データのブロックをデータベースから C 関数にコピーして処理し、クエリの結果として返すために利用できる最高のパフォーマンスを達成することです。

私は PostgreSQL を初めて使用し、現在、データを移動する方法を調査しています。具体的には、ビッグデータを高速に移動するために、特に PostgreSQL に関連するニュアンスやキーワードを探しています。

注: 私の究極の目標は速度であるため、大きなパフォーマンス結果が得られる限り、私が提起した正確な質問以外の回答を喜んで受け入れます。たとえば、データをテーブルからファイルにすばやく移動する COPY キーワード (PostgreSQL のみ) を見つけました。およびその逆。データベースの外部にある処理を避けようとしていますが、外部処理の明らかな欠点を上回るパフォーマンスの向上が得られるのであれば、それはそれで構いません。

4

1 に答える 1

4

サーバープログラミングインターフェイス(SPI)を使用して、PostgreSQLバックエンド内で実行されるC言語関数としてストアドプロシージャを実装することをお勧めします。

SPI_connectSPIのセットアップに使用します。

次にSPI_prepare_cursorクエリ、次にSPI_cursor_openそれ。SPI_cursor_fetchそれからの行とSPI_cursor_close完了したらそれ。SPI_cursor_fetch行のバッチをフェッチできることに注意してください。

SPI_finish完了したらクリーンアップします。

結果の行を生成するときにタプルストアに返すことができるため、テーブル全体をメモリに構築する必要がありません。PostgreSQLソースコードのset-returning関数の例を参照してください。SPI_returntupleヘルパー関数も確認することをお勧めします。

参照:C言語関数拡張SQL

最大速度が重要な場合、クライアントはlibpqtypesを介してlibpqバイナリプロトコルを使用して、最小限のオーバーヘッドでサーバー側のSPI使用手順によって生成されたデータを受信することができます。

于 2012-11-06T00:10:47.180 に答える