4
SELECT * FROM ( 
   select * 
   from tableA 
   where ColumnA = 'randomText' 
   ORDER BY columnL ASC 
) WHERE ROWNUM <= 25

このクエリを実行すると、Oracle の最適化により、クエリの実行に約 14 分かかります。where句を削除すると、クエリは数秒で実行されます。上記のものを含め、テーブルのほとんどの列にはインデックスがあります。休止状態を使用しているため、クエリの構造にあまり柔軟性がありません。

このクエリもすぐに結果を返し、正しい結果が返されます。

SELECT * 
FROM ( 
   select * 
   from tableA, 
        dual 
   where ColumnA = 'randomText' 
   ORDER BY columnL ASC
) WHERE ROWNUM <= 25

休止状態を使用してできることはありますか?

更新: 私は EntityManager.createQuery() を使用し、setMaxResults(25) と setFirstResult() も使用します。上記のクエリは、ログを観察すると、休止状態のクエリがどのように見えるかです

4

2 に答える 2

0

クエリに完全に一致する説明計画は得られませんが、2 つのクエリに異なるインデックスを使用しているようです。

columnAとを含むインデックスを作成できますcolumnLか?

のみを含むインデックスがある場合はcolumnA、他のクエリのパフォーマンスに大きな影響を与えることなく、それを削除できる場合があります。

別の方法は、より高速なクエリで使用されるインデックスを使用するためのヒントを追加することです。ただし、これにはネイティブ SQL を使用する必要があります。

于 2012-09-18T04:33:58.983 に答える
-2

これは、hibernate/jpa を使用していることを意味しますか? EntityManager.createNativeQuery()もしそうなら、クエリを作成するためにを使用していると思いますか? where-restriction を削除して、代わりに.setMaxResults(25)onを使用してみてください。Query

とにかく、なぜ外部選択が必要なのですか? しません

select * 
from tableA 
where ColumnA = 'randomText' 
AND ROWNUM <= 25
ORDER BY columnL ASC 

望ましい結果を生み出しますか?

于 2012-09-17T14:22:22.120 に答える