新しいユーザー名は一意である可能性が高いと思いますか?それとも重複する可能性がありますか?ユーザー名が一意である可能性が高い場合は、挿入を実行して例外をキャッチする方が効率的です。ユーザー名が重複している可能性が高い場合は、例外をキャッチしようとするよりも、重複をチェックする(そして、類似しているがまだ取得されていないユーザー名を探す可能性がある)方が効率的です。明らかに、異なるデータベースおよびそれらのデータベースの異なるバージョンは、相対確率に関して異なる損益分岐点を持っています。しかし、一般的に、誰もが一意のユーザー名を持っている会社のシステムを構築している場合は、挿入を実行して例外をキャッチします。Hotmailを構築している場合は、最初に重複を確認してください。
簡単なデモ(Oracle 11.2.0.1)は、挿入の前にチェックを実行してからデータを書き込むよりも、失敗した挿入を実行して例外を処理するのに約7倍のコストがかかることを示しています。
SQL> create table username_test (
2 username varchar2(30) unique
3 );
Table created.
SQL> set timing on;
SQL> ed
Wrote file afiedt.buf
1 declare
2 l_cnt integer;
3 begin
4 for i in 1 .. 100000
5 loop
6 select count(*)
7 into l_cnt
8 from username_test
9 where username = 'JCAVE';
10 if( l_cnt = 0 )
11 then
12 insert into username_test( username )
13 values( 'JCAVE' );
14 end if;
15 end loop;
16* end;
SQL> /
PL/SQL procedure successfully completed.
Elapsed: 00:00:04.20
SQL> rollback;
Rollback complete.
Elapsed: 00:00:00.00
SQL> ed
Wrote file afiedt.buf
1 declare
2 l_cnt integer;
3 begin
4 for i in 1 .. 100000
5 loop
6 begin
7 insert into username_test( username )
8 values( 'JCAVE' );
9 exception
10 when dup_val_on_index then
11 null;
12 end;
13 end loop;
14* end;
SQL> /
PL/SQL procedure successfully completed.
Elapsed: 00:00:29.58