単純な単一の索引検索で解決できない問合せでは、パフォーマンスが大幅に向上します(平均数十万)。テーブル結合。 しかし、データ/アプリケーションエラーを隠す可能性があります。可能な限りの例では、同じくらい簡単にするためにPKを使用していない--intentionally
create table t (id number(10,0), padding varchar2(1000));
:
はテーブルを持っています。今、あなたはDBのテーブル全体かどうかを経由しなければならない
select 1 into ll_exists
from t where id = 5;
ような何かを頼む場合
insert into t (id, padding)
select rownum, rpad(' ', 1000) from dual connect by level < 10000
:パディングは、各レコード多数のレコードを持つ
に実際のデータロードをシミュレートするために使用されます最初のデータブロック(これはさまざまな方法で挿入することができないため、わからない)または唯一の一致するレコードが見つかりました。これは、一致するレコードが1つしかないことを知らないためです。一方、...とrownum = 1を使用すると、別の一致するレコードがない(または必要ではない)ということを伝えたため、レコードが見つかった後にデータを走査するのを止めることができます。
欠点は、データに複数の可能なレコードが含まれている場合、rownum制約で不確定的な結果が得られることです。 クエリが
select id into ll_id
from t where mod (id, 2) = 1
and rownum = 1;
だった場合、私はDBの答え1と同様に3と同様に123から受け取ることができる...順序は保証され、これは結果であるされていません。 (rownum節なしでは、私はTOO_MANY_ROWS例外が発生します。どちらが悪いのかによって決まります)
本当に存在をテストするクエリが必要な場合は、それをそのまま書いてください。
begin
select 'It does'
into ls_exists
from dual where
exists (your_original_query_without_rownum);
do_something_when_it_does_exist
exception
when no_data_found then
do_something_when_it_doesn't_exist
end;
最初のクエリは、SELECT 1ではなくSELECT COUNT(1)を持つことを意図していますか? –
SELECT 1(つまり、行数をカウントするのではなく、返される行に定数を選択します) – darreljnz