sql >> データベース >  >> RDS >> PostgreSQL

巨大なテーブルからすべての行を読み取る方法は?

    短いバージョンは、stmt.setFetchSize(50);を呼び出します。 およびconn.setAutoCommit(false); ResultSet全体を読み取らないようにするため メモリに。

    ドキュメントの内容は次のとおりです:

    カーソルに基づいて結果を取得する

    デフォルトでは、ドライバーはクエリのすべての結果を一度に収集します。これは大きなデータセットには不便な場合があるため、JDBCドライバーは、データベースカーソルに基づいてResultSetを基にし、少数の行のみをフェッチする手段を提供します。

    少数の行が接続のクライアント側にキャッシュされ、使い果たされると、カーソルを再配置することによって次の行のブロックが取得されます。

    注:

    • カーソルベースのResultSetは、すべての状況で使用できるわけではありません。ドライバーがResultSet全体を一度にフェッチすることにサイレントフォールバックするようにするいくつかの制限があります。

    • サーバーへの接続は、V3プロトコルを使用している必要があります。これは、サーバーバージョン7.4以降のデフォルトです(サポートされているだけです)。-

    • 接続は自動コミットモードであってはなりません。バックエンドはトランザクションの終了時にカーソルを閉じるため、自動コミットモードでは、バックエンドはカーソルから何かをフェッチする前にカーソルを閉じます。-

    • ステートメントは、ResultSet.TYPE_FORWARD_ONLYのResultSetタイプで作成する必要があります。これはデフォルトであるため、これを利用するためにコードを書き直す必要はありませんが、逆方向にスクロールしたり、ResultSet内をジャンプしたりすることはできません。-

    • 指定するクエリは、セミコロンでつながれた複数のステートメントではなく、単一のステートメントである必要があります。

    例5.2。カーソルをオンまたはオフにするフェッチサイズを設定します。

    コードをカーソルモードに変更するのは、ステートメントのフェッチサイズを適切なサイズに設定するのと同じくらい簡単です。フェッチサイズを0に戻すと、すべての行がキャッシュされます(デフォルトの動作)。

    // make sure autocommit is off
    conn.setAutoCommit(false);
    Statement st = conn.createStatement();
    
    // Turn use of the cursor on.
    st.setFetchSize(50);
    ResultSet rs = st.executeQuery("SELECT * FROM mytable");
    while (rs.next()) {
       System.out.print("a row was returned.");
    }
    rs.close();
    
    // Turn the cursor off.
    st.setFetchSize(0);
    rs = st.executeQuery("SELECT * FROM mytable");
    while (rs.next()) {
       System.out.print("many rows were returned.");
    }
    rs.close();
    
    // Close the statement.
    st.close();
    


    1. SQL ServerのCAST()とTRY_CAST():違いは何ですか?

    2. 複数の結果セットを持つストアドプロシージャからデータを取得します

    3. phpとmysqlを使用したjqueryの星評価チュートリアル

    4. オプティマイザーがバッファープールの知識を使用しない理由