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

データベースからシーケンシャルデータを取得する最速の方法は何ですか?

    SELECT * FROM table ORDER BY column
    

    テーブル全体をRAMに吸い込む理由はありません。カーソルを開いて読み始めるだけです。フェッチサイズなどでゲームをプレイできますが、行を処理している間、DBはその場所を喜んで維持します。

    補遺:

    わかりました。Javaを使用している場合は、問題が何であるかがわかります。

    まず、Javaを使用するだけで、カーソルを使用します。これが基本的にJavaのResultSetです。一部のResultSetは他のResultSetよりも柔軟性がありますが、それらの99%は単純であり、各行を取得するために「next」を呼び出すResultSetのみを転送します。

    さて、あなたの問題についてです。

    問題は特にPostgresJDBCドライバーにあります。なぜ彼らがこれを行うのかはわかりません、おそらくそれは仕様であり、おそらくそれは別のものですが、それにもかかわらず、Postgresには、接続でautoCommitがtrueに設定されている場合、Postgresがいずれかの結果セット全体を吸い込むことを決定するという奇妙な特性がありますメソッドまたは最初の次のメソッドを実行します。どこにあるかについてはそれほど重要ではありませんが、膨大な数の行がある場合にのみ、すばらしいOOM例外が発生します。役に立たなかった。

    これは簡単にあなたが見ているものとまったく同じである可能性があり、それが非常に苛立たしくて混乱する可能性があることを感謝しています。

    ほとんどの接続のデフォルトはautoCommit=trueです。代わりに、autoCommitをfalseに設定するだけです。

    Connection con = ...get Connection...
    con.setAutoCommit(false);
    PreparedStatement ps = con.prepareStatement("SELECT * FROM table ORDER BY columm");
    ResultSet rs = ps.executeQuery();
    while(rs.next()) {
        String col1 = rs.getString(1);
        ...and away you go here...
    }
    rs.close();
    ps.close();
    con.close();
    

    読者の演習として残された、例外処理の明確な欠如に注意してください。

    一度にメモリにフェッチされる行数をより細かく制御する場合は、次を使用できます。

    ps.setFetchSize(numberOfRowsToFetch);
    

    それをいじってみると、パフォーマンスが向上する可能性があります。

    順序付けに関心がある場合は、ORDERBYで使用する列に適切なインデックスがあることを確認してください。



    1. VB.NETを使用して、datagridviewからデータベーステーブルに複数のレコードを挿入します

    2. PHPまたはJavaScriptでExcelの41014の日付を実際の日付に変換します

    3. SQLは同じフィールドで複数の値を検索します

    4. Slick 3.0を使用してMysqlに接続する-ユーザー名、パスワード、および偽のドライバーがエラーと等しくない