0

数百万行のテーブルをいくつかスキャンする SQL クエリを実行しています。私が実装しようとしていたのは、選択クエリが結果セットに含まれる行が 1 つだけの場合にのみ結果を返すことでした。私はそれを行うためにこれらの2つのアプローチを知っていました:

1) group by を使用してから、'having count( * )' を使用します。

2) さらに 'count( * ) over' を使用する内部クエリを使用する

しかし、これらのアプローチはどちらもパフォーマンスを妨げます。これを行うための他のより高速なアプローチがあるかどうかを知りたいです。さらに情報が必要な場合はお知らせください。ありがとう。

4

2 に答える 2

1

純粋な SQL の場合はこのようにします。

select * 
  from (select c.*, count(*) over() cnt 
          from (select * from table where x = 'a' etc) c 
         where rownum <= 2) 
 where cnt = 1;

もちろん、クエリに順序がある場合は、とにかく結果セットをスキャンする必要があります (その場合は、正しいインデックス付け + おそらく最初の行のヒントが役立ちます)。

于 2012-11-29T10:52:44.550 に答える
0

最速の方法は、ストップキーを使用して最初の 2 行を選択することです (その後、クライアント側で、または別の SELECT にラップすることによって、複数の行がある場合は結果を破棄します)。

何かのようなもの

SELECT * from (
   SELECT * from 
     THE_MASSIVE_QUERY_WITH_ALL_SORTING_REMOVED_BECAUSE_YOU_DONT_NEED_IT
) WHERE rownum < 3

このようにして、2 番目の行が見つかったら停止するように Oracle に指示します。実際のカウントを決定する必要はありません (時間がかかる可能性があります)。

于 2012-11-29T10:49:53.060 に答える