legacy-knowledge-base
公開されました Sep. 10, 2025

DB2 でビッグテーブルに対する SQL クエリを実行する際に、一意でないインデックスを持つカラムでフィルタリングするとパフォーマンスが低下する。

written-by

Daniel Couso

How To articles are not official guidelines or officially supported documentation. They are community-contributed content and may not always reflect the latest updates to Liferay DXP. We welcome your feedback to improve How To articles!

While we make every effort to ensure this Knowledge Base is accurate, it may not always reflect the most recent updates or official guidelines.We appreciate your understanding and encourage you to reach out with any feedback or concerns.

legacy-article

learn-legacy-article-disclaimer-text

Liferay Supportは、特定のサードパーティ製品を他の製品よりも推奨または承認するものではありません。 Liferayは、これらの製品に関して、ここに記載または参照されているいかなる指示に対しても責任を負いません。 これらの原則の実行は、加入者の責任において行われるものとします。

この記事は、 SELECT * FROM table_ WHERE column_ = ? whose のようなSQLクエリを実行する際のDB2の既知の問題を文書化したものです:

  1. つまり、Service Builder の定義には、一意ではないインデックスを生成する一意ではない非コレクション ファインダーがあります。
  2. テーブル table_ のレコード数が数十万件である
  3. column column_のすべての値がデフォルト値に設定される(数値型の場合、デフォルト値は0)。

このタイプのクエリの具体例は、 SELECT Group_.* FROM Group_ WHERE Group_.liveGroupId = ? 膨大な数のサイトがあり、そのどれもがローカルステージング下にないものである。

この動作の背景には、非ユニークインデックスを使用した方が性能が良いにもかかわらず、DB2プランナーがテーブルのサイズを考慮せずにフルテーブルスキャンを行うという判断を下していることがあります。

db2 runstats on table table_ というコマンドを実行しても、クエリの実行プランに違いはありません。

解像度

ステータス修正しない / 回避策あり

この問題はDB2プランナー特有のもので、上記のような特殊なシナリオでしか再現できないため、 、修正されることはありません

回避策としては、対象テーブルの属性 VOLATILEtrue に設定することで、一意でないインデックスを強制的に使用させることができます。

これは、すでにインデックスを使用している現在のクエリでは何の影響もありませんが、インデックスを使用しない他のいくつかのクエリのパフォーマンスには若干のペナルティがあるかもしれません。

追加情報

did-this-article-resolve-your-issue

legacy-knowledge-base