0

何百万ものレコードを持つテーブルがあります。

Oracleが最初の一致を見つける限り、Oracleが検索を停止することを確認したいと思います。

select * from table1
where table1.column1 = 'somevalue' 
  AND table2.column2 = 'somevalue' 
  AND rownum = 1

Oracleはcolumn1とcolumn2の条件を満たすすべての行をフェッチし、rownumフィルターのみを適用して最初の行を取得するため、目的が果たせないという話を聞きました。

4

2 に答える 2

4

クエリに対して実行計画を実行すると、間違っていることがわかります。Oracle は、行がクエリの残りの部分に基づいて結果セットの一部として識別されるとすぐに、rownum 述語を適用します。

于 2012-11-27T08:58:16.067 に答える
0

結果を達成する方法が他にないことが 101% 確実でない限り、クエリ ヒントの使用は一般に推奨されません(時期尚早の最適化に関する引用を覚えておくことが非常に重要です!!!)。/*+ FIRST_ROWS(<integer>) */最初のレコードをできるだけ早く取得するための実行計画を最適化するように Oracle に指示します。

select * /*+ FIRST_ROWS(1) */ from table1
where table1.column1 = 'somevalue' 
  AND table2.column2 = 'somevalue' 
  AND rownum = 1

推奨読書:

常に覚えておいてください:ヒントを使用することは常にポジティブであるとは限りません.オプティマイザーはそれ自体がかなり賢いです.ヒントを適用することで、クエリをはるかに遅くすることができます. また、たとえばテーブルが大きくなるなど、現在ヒントが機能している場合、将来的に問題が発生する可能性があります...また、ヒントは黒魔術であるため、DBAでない限り、ヒントから遠ざかるようにしてください。少なくとも経験豊富な DBA に助けを求めてください。(この非常に単純なケースではありませんが、クエリ自体を再考するのに役立つ場合があります。)

于 2012-11-27T08:59:37.397 に答える