4

次のコードで Postgres への SQL クエリを実行する必要があります。クエリは膨大な数の行 (40M 以上) を返し、4 つの整数フィールドがあります。データセット全体を待たずに、バッチで行をロードするように C++ に指示する方法はありますか? Java では、おそらくより優れた JDBC ドライバーのおかげで、これらの問題はこれまで一度もありませんでした。

try {
        work W(*Conn);
        result r = W.exec(sql[sqlLoad]);
        W.commit();

        for (int rownum = 0; rownum < r.size(); ++rownum) {
            const result::tuple row = r[rownum];
            vid1 = row[0].as<int>();
            vid2 = row[1].as<int>();
            vid3 = row[2].as<int>();
            ..... 

    } catch (const std::exception &e) {
        std::cerr << e.what() << std::endl;
    }

私は PostgreSQL 9.3 を使用していますが、このhttp://www.postgresql.org/docs/9.3/static/libpq-single-row-mode.htmlが表示されますが、C++ コードで使用する方法がわかりません。あなたの助けに感謝します。

編集:このクエリは、必要なメイン メモリ データ構造を作成するために、1 回だけ実行されます。そのため、tt は最適化できません。また、pgAdminIII は、同じ (または RAM が小さい) PC で 1 分以内にこれらの行を簡単に取得できます。また、Java は 2 倍の行数を簡単に処理できます (Statent.setFetchSize() http://docs.oracle.com/javase/7/docs/api/java/sql/Statement.html#setFetchSize%28int%29を使用) 。したがって、これは実際には libpqxx ライブラリの問題であり、アプリケーションの問題ではありません。制限/オフセットを手動で明示的に設定せずに、C++ でこの機能を強制する方法はありますか?

4

3 に答える 3

2

カーソルを使用しますか?

FETCHも参照してください。カーソルは舞台裏でそれを使用しますが、念のため、いつでも FETCH を使用してストリーミング検索を手動でコーディングできます

于 2014-04-28T10:06:21.317 に答える