Oracle 11gR2 と Hibernate 4.2.1 を使用しています。私のアプリケーションは検索アプリケーションです。
SELECT 操作のみがあり、それらはすべてネイティブ クエリです。
Oracle はデフォルトで大文字と小文字を区別するソートを使用します。大文字と小文字を区別しないようにオーバーライドしたい。
ここでいくつかのオプションを見ましたhttp://docs.oracle.com/cd/A81042_01/DOC/server.816/a76966/ch2.htm#91066
現在、検索を実行する前にこのクエリを使用しています。
ALTER SESSION SET NLS_SORT='BINARY_CI'
検索クエリを実行する前に上記の sql を実行すると、hibernate が検索クエリから戻るまでに約 15 分かかります。Sql Developerでこれを行うと、数秒以内に戻ります。
なぜこのような 2 つの異なる動作が発生するのか、この遅さを解消するにはどうすればよいでしょうか?
注: 私は常に、検索ごとに新しい Hibernate セッションを開きます。
ここに私のSQLがあります:
SELECT *
FROM (SELECT
row_.*,
rownum rownum_
FROM (SELECT
a, b, c, d, e,
RTRIM(XMLAGG(XMLELEMENT("x", f || ', ') ORDER BY f ASC)
.extract('//text()').getClobVal(), ', ') AS f,
RTRIM(
XMLAGG(XMLELEMENT("x", g || ', ') ORDER BY g ASC)
.extract('//text()').getClobVal(), ', ') AS g
FROM ( SELECT src.a, src.b, src.c, src.d, src.e, src.f, src.g
FROM src src
WHERE upper(pp) = 'PP'
AND upper(qq) = 'QQ'
AND upper(rr) = 'RR'
AND upper(ss) = 'SS'
AND upper(tt) = 'TT')
GROUP BY a, b, c, d, e
ORDER BY b ASC) row_
WHERE rownum <= 400
) WHERE rownum_ > 0;
多くのフィールドが LIKE 操作に付属しており、動的 SQL クエリです。order by upper(B) asc
Sql Developerを使用すると、同じ時間がかかります。ただし、結果の上位順は と同じNLS_SORT=BINARY_CI
です。インデックスを使用UPPER('B')
しましたが、何もうまくいきません。
Aの長さ = 10~15文字
B の長さ = 34 ~ 50 文字
C の長さ = 5 ~ 10 文字
A、B、C は、アプリで並べ替え可能なフィールドです。この SRC テーブルには 300 万以上のレコードがあります。最終的に、マテリアライズド ビューである SRC テーブルになりました。
SQL のビジネス ロジックはまったく問題ありません。すべてのソート テーブル フィールドとその他は、UPPER インデックスが付けられます。