는 새 사용자 이름은 고유 가능성이 기대하십니까? 아니면 중복 될 가능성이 있습니까? 사용자 이름이 고유해야 할 경우 삽입을 수행하고 예외를 포착하는 것이 더 효율적입니다. 사용자 이름이 중복 될 가능성이있는 경우 예외를 잡으려고 시도하는 대신 중복을 확인하는 것이 좋습니다 (잠재적으로 유사한 사용자 이름을 찾습니다). 분명히 다른 데이터베이스와 다른 버전의 데이터베이스는 상대 확률에 다른 손익분기 점을 가지고 있습니다. 그러나 일반적으로 모든 사용자가 고유 한 사용자 이름을 사용하는 회사 시스템을 구축하는 경우 삽입을 수행하고 예외를 잡습니다. 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
단순히 삽입을 수행하고 실패했는지 확인하는 것보다 두 개의 쿼리를 수행하는 것이 더 빠르다는 것을 의미합니까? 논리적으로 보이지 않기 때문에이를 보여주는 벤치 마크를보아야합니다. – corsiKa
@glowcoder - 예, 있습니다. 예외 처리는 비용이 많이 들며, 예상치 못한 일이 발생했을 때 사용되도록되어 있습니다. 단일 행 검사는 일반적으로 예외 처리보다 비용이 적게 듭니다. –
그러나 예외는 드문 경우이지만 인서트 작업이 더 일반적인 경우가 더 느립니다. – HLGEM