web-dev-qa-db-ja.com

選択クエリの最適なフェッチサイズを把握する方法

JDBCでは、デフォルトのフェッチサイズは10ですが、100万行ある場合、これは最適なフェッチサイズではないようです。フェッチサイズが小さすぎるとパフォーマンスが低下するが、フェッチサイズが大きすぎる場合も理解しています。

最適なサイズを見つけるにはどうすればよいですか?そして、これはDB側に影響を及ぼしますか?それは大量のメモリを消費しますか?

13
KKO

(ほとんど)何でもそうであるように、特定のパラメーターの最適なサイズを見つける方法は、パラメーターのさまざまな値を使用して最適化しようとしているワークロードをベンチマークすることです。この場合、異なるフェッチサイズ設定でコードを実行し、結果を評価して、最適な設定を選択する必要があります。

ほとんどの場合、ユーザーは100または1000のフェッチサイズを選択しますが、それが合理的に最適な設定であることがわかります。その時点での値間のパフォーマンスの違いは一般にごくわずかです。実行間のパフォーマンスの違いのほとんどは、フェッチサイズの変更が原因ではなく、通常のランダムな変動の結果であると予想されます。特定の構成で特定のワークロードのパフォーマンスの最後の制限を取得しようとしている場合は、確かにその分析を行うことができます。ただし、ほとんどの人にとって、100または1000で十分です。

11
Justin Cave

行が大きい場合は、一度にフェッチするすべての行をJavaドライバーの内部バッファーのヒープに保存する必要があることに注意してください。12cでは、OracleにはVARCHAR(32k)があります。それらの50があり、それらがいっぱいである場合、列は1行あたり1,600,000文字です。各文字はJavaでは2バイトです。したがって、各行は最大3.2MBを占めることができます。行を100行100列フェッチする場合は、データを格納するために320MBのヒープが必要であり、それは1つのステートメントに対してだけなので、適度に小さい行(データサイズが小さい)をフェッチするクエリの行プリフェッチサイズのみを増やす必要があります。

13

JDBCフェッチサイズプロパティのデフォルト値はdriver specificであり、Oracleドライバの場合、実際には10です。

一部のクエリではフェッチサイズを大きくし、一部のクエリではフェッチサイズを大きくする必要があります。

プロジェクト全体にglobalフェッチサイズをいくつか設定し、overwriteいくつかに設定することをお勧めしますindividual query大きくする必要があります。

この記事を見てください:

http://makejavafaster.blogspot.com/2015/06/jdbc-fetch-size-performance.html

フェッチサイズをグローバルに設定し、Hibernate、JPA、Spring jdbcテンプレート、またはコアjdbc APIなどのさまざまなアプローチを使用して慎重に選択されたクエリに対してそれを上書きする方法についての説明があります。そして、いくつかの単純なOracleのベンチマークデータベース。

経験則として、次のことができます。

  • fetchsizeを50-1にグローバル設定として設定します
  • 個々のクエリに対してfetchsizeを100-5(またはそれ以上)に設定します
5
przemek hertel

JDBCのデフォルトのプリフェッチサイズは10です。 JDBC Javadoc のOracleConnection.getDefaultRowPrefetchを確認してください。

0
Nirmala