6

postgresql データベースのテーブルに対してクエリを実行しています。データベースはリモート マシン上にあります。このテーブルには、postgresqlパーティショニング機能を使用した約 30 のサブテーブルがあります。

クエリは、約 180 万行の大きな結果セットを返します。

私のコードでは、春の jdbc サポート、メソッドJdbcTemplate.queryを使用していますが、RowCallbackHandlerが呼び出されていません。

私の推測では、コードを呼び出す前に、postgresql jdbc ドライバー (私はバージョン 8.3-603.jdbc4 を使用しています) が結果をメモリに蓄積しています。fetchSize 構成でこれを制御できると思いましたが、試してみましたが、何も変わりません。postgresqlマニュアルが推奨するようにこれを行いまし

このクエリは、Oracle XE を使用したときに正常に機能しました。しかし、Oracle XE では使用できないパーティショニング機能のために、postgresql に移行しようとしています。

私の環境:

  • Postgresql 8.3
  • Windows Server 2008 エンタープライズ 64 ビット
  • JRE 1.6 64 ビット
  • 春 2.5.6
  • Postgresql JDBC ドライバー 8.3-603
4

4 に答える 4

6

カーソルを使用してデータを取得するには、フェッチサイズの設定に加えて、ResultSet.TYPE_FORWARD_ONLY(デフォルト)のResultSetタイプを設定し、falseに自動コミットする必要があります。これは、リンク先のドキュメントで参照されていますが、これらの手順を実行したことを明示的に言及していません。

PostgreSQLのパーティションスキームに注意してください。それはオプティマイザーで本当にひどいことをし、(データの詳細に応じて)あるべきではないところに大規模なパフォーマンスの問題を引き起こす可能性があります。いずれにせよ、あなたの行はたったの180万行ですか?適切にインデックスが付けられていることを考えると、サイズのみに基づいてパーティション化する必要がある理由はありません。

于 2009-05-06T00:50:03.383 に答える
3

180 万行を同時に必要とするアプリのクライアントは 1 つもないと思います。結果をより小さな断片にチャンクし、ユーザーにそれらを反復する機会を与える賢明な方法を考える必要があります。

それがGoogleのすることです。検索を行うと、何百万ものヒットがあるかもしれませんが、最初のページで必要なものが見つかるという考えで、一度に 25 ページが返されます。

それがクライアントではなく、何らかの方法で結果が処理されている場合は、データベースにそれらすべての行をクランチさせ、単に結果を返すようにすることをお勧めします。中間層で計算を行うためだけに 180 万行を返すのは意味がありません。

どちらにも当てはまらない場合は、本当の問題があります。それを再考する時が来ました。

後の回答を読んだ後、これは、バッチでクランチするか、リアルタイムで計算して、トランザクション システムの一部ではないテーブルに保存する必要があるレポート ソリューションのように思えます。移動平均を計算するために 180 万行を中間層に持ち込んでスケーリングする方法はありません。

自分自身の方向を変えることをお勧めします-レポートソリューションとして考え始めてください.

于 2009-05-05T22:50:11.453 に答える
1

上記のすべてを実行しましたが、最後にもう 1 つ必要でした。呼び出しがトランザクションにラップされていることを確認し、トランザクションを読み取り専用に設定して、ロールバック状態が不要になるようにします。

私はこれを追加しました:@Transactional(readOnly = true)

乾杯。

于 2015-08-12T18:39:51.440 に答える