2013-10-01 2 views
2

오랫동안 주어진 조건에서 주어진 테이블에 하나 이상의 레코드가 존재하는지 확인하기 위해 오랫동안 EXISTS 절을 사용했습니다. 예를 들어 - 나는 LASTNAME = '스미스'로 직원이 "직원"테이블에 존재하는지 확인하기를 원한다면, 나는이 확실히 더 효율적으로 수를 사용하는 것보다 다음 쿼리Oracle EXISTS 절 Vs ROWNUM = 1

select 1 
    into v_exists_flag 
    from dual 
where exists (select 1 
       from employee 
       where lastname = 'smith' 
      ) 

을 사용 (*) 절.

select count(*) 
    into v_count 
    from employee 
where lastname = 'smith' 

는 v_count은> 다음 0 ....

그러나 최근 누군가가 ROWNUM = 1을 사용하여

select 1 
    into v_count 
    from employee 
where lastname = 'smith' 
    and rownum = 1 

이인가 아래 그림과 같이 절을 EXISTS 사용하는 것보다 더 나은 성능을 가지고 있음을 언급 한 경우 옳은? 누군가 이것을 확인할 수 있습니까? 사전에

덕분에

답변

3

활성화 자동 추적과 함께 두 가지 옵션을 시도하고 적은 수의 일치 가져 않는 사람을 참조하십시오. 나는 그들이 둘 다 똑같이 수행 할 것이라고 생각하지만, 나에게는 rownum 예제가 더 읽기 쉽다.

예 :

SQL> create table t1 as select object_name from all_objects; 

Table created. 

SQL> create index t1_idx1 on t1 (object_name); 

Index created. 

SQL> set autot on 

SQL> select 1 from t1 where object_name = 'TOP_N' and rownum = 1; 

    1 
---------- 
    1 
Statistics 
---------------------------------------------------------- 
    0 recursive calls 
    0 db block gets 
    2 consistent gets 
    0 physical reads 
    0 redo size 
519 bytes sent via SQL*Net to client 
523 bytes received via SQL*Net from client 
    2 SQL*Net roundtrips to/from client 
    0 sorts (memory) 
    0 sorts (disk) 
    1 rows processed 

SQL> select 1 from dual where exists (select object_name from t1 where object_name = 'TOP_N'); 

    1 
---------- 
    1 

Statistics 
---------------------------------------------------------- 
    0 recursive calls 
    0 db block gets 
    2 consistent gets 
    0 physical reads 
    0 redo size 
519 bytes sent via SQL*Net to client 
523 bytes received via SQL*Net from client 
    2 SQL*Net roundtrips to/from client 
    0 sorts (memory) 
    0 sorts (disk) 
    1 rows processed 
1

유래에 비슷한 질문이 있었다.

여기에 아담 Musch는 실제 차이가 없다고 주장한다 : 여기 The fastest way to check if some records in a database table?

은 ROWNUM = 1 개 성능에 대한 또 다른 주제 : 내가 인덱싱되지 않은 테이블에 모두를 시도, 그러나 Under what conditions does ROWNUM=1 significantly increase performance in an "exists" syle query

및 비용 때문에 DU의 추가 필요에

ROWNUM approach plan EXISTS approach plan 분명히 더 높은 계획은 다음이 접근 방식은 약간 높은 EXISTS AL 전화.

예 :

CREATE TABLE rownum_test (x) 
    AS SELECT rownum FROM all_objects; 

DECLARE 
    v_exists NUMBER; 
BEGIN 
    FOR v_i IN 1..34050 LOOP 
    SELECT 1 
     INTO v_exists 
     FROM dual 
    WHERE EXISTS (SELECT 1 FROM rownum_test WHERE x = v_i); 
    END LOOP; 
END; -- 13,2 seconds 

DECLARE 
    v_exists NUMBER; 
BEGIN 
    FOR v_i IN 1..34050 LOOP 
    SELECT 1 
     INTO v_exists 
     FROM rownum_test 
    WHERE x = v_i AND rownum = 1; 
    END LOOP; 
END; -- 13,3 seconds 

테스트, 다른 한편으로는, ROWNUM 접근 방식이 약간 느린 것을 보여줍니다 -하지만 내 간단한 테스트 데이터가 충분하지 않습니다 것을 할 수있다.

Oracle 11G R2에서 테스트.

+0

둘 다 감사합니다 (스티븐 및 프레이즈 슬로). – user2836468

+0

안녕 Przemyslaw - 방금 Adam Musch의 게시물을 읽었습니다. 칼럼에 색인을 붙이면 큰 차이는 없습니다. – user2836468

+0

죄송합니다 - 실수로 보내기를 누르 십니다. – user2836468