Ожидаете ли вы, что новое имя пользователя, вероятно, будет уникальным? Или, скорее всего, это будет дубликат? Если имя пользователя, вероятно, будет уникальным, вставка и отлов исключения будут более эффективными. Если имя пользователя может быть дубликатом, будет более эффективно проверять наличие дубликатов (и, возможно, искать похожее, но еще не занятое имя пользователя), а не пытаться перехватить исключение. Очевидно, что разные базы данных и разные версии этих баз данных имеют разные точки безубыточности по относительной вероятности. Но в целом, если вы создаете систему для компании, в которой все равно имеют уникальное имя пользователя, вставьте и поймайте исключение. Если вы создаете 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