遅延初期化コレクションを持つエンティティがあります:
SomeEntity someEntity = template.findByNamedQuery("queryName", entityId);
if (someEntity != null) {
Hibernate.initialize(someEntity.getChildCollection());
}
Hibernate 生成 SQL:
SELECT
t.COL1 AS COL1_,
t.COL2 AS COL2_,
...
t.COLN AS COLN_
FROM SCHEMA.TABLE t
WHERE t.COLX = :1
ORDER BY t.COL1 ASC;
列 COLX にはインデックス IDX_COLX があります。
しかし、何らかの理由で、Oracle がこのインデックスを使用せず、テーブルに対してフル スキャンを使用することがあります。私はDBを制御していませんが、これに対する解決策はOracleにヒントを渡すことであると(db管理者から)言われました。
このようなもの:
SELECT /*+ index(t IDX_COLX) */
t.COL1 AS COL1_,
t.COL2 AS COL2_,
...
t.COLN AS COLN_
FROM SCHEMA.TABLE t
WHERE t.COLX = :1
ORDER BY t.COL1 ASC;
生成された SQL クエリにこの追加情報を強制的に付加する簡単な方法はありますか? Oracle のバグや構成ミスのために、アプリケーション全体を書き直したくありません。
休止状態 3.3.2 を使用します。
編集:
私は StuPointerException によって与えられた解決策を試しましたが、生成された SQL は次のようになります。
/*+ index(t IDX_COLX) */
SELECT
t.COL1 AS COL1_,
t.COL2 AS COL2_,
...
t.COLN AS COLN_
FROM SCHEMA.TABLE t
WHERE t.COLX = :1
ORDER BY t.COL1 ASC;
Oracle SQL Developerでテストしたところ、SELECTステートメントの前に配置された場合、Oracleはこのヒントを認識しないようです。