2014-03-31 3 views
0

코드를 실행하려면 특정 행이있을 때만 존재를 확인하는 올바른 방법은 무엇입니까? 이전에는 전반적인 성능에 거의 영향을 미치지 않으면 서 다양한 방법을 사용했습니다 ... 대체 방법간에 상당한 차이가 있는지 궁금해 한 적이 있습니까?SQL "레코드가 있습니까?"

IF EXISTS (SELECT * FROM MYTABLE WHERE...) 

IF (SELECT COUNT(*) FROM MYTABLE WHERE...) > 0 

위의 방법보다 효과적인 방법이 있습니까?

아마도 누군가가 권장 된 접근 방식을 제공 할 수 있으며 그 접근 방식이 다른 방식보다 나은 이유는 무엇일까요?

+1

왜 행이 있는지 알고 싶다면 행을 계산 하시겠습니까? 따라서 실행 계획이 동일하더라도 첫 번째 방법이 더 읽기 쉽습니다. –

답변

5

dbms는 EXISTS 절에서 아무것도 검색 할 필요가 없다는 것을 알기에 충분히 똑똑합니다.

어쩌면 옛날하지만 일반적인 방법은 사용자의 명시 적 (그러나 실행 계획에 대한 아무 것도 변경하지 않는 것은)

if exists (select * from) 

if exists (select null from) --or select 1 from 

하지만

이 같은 일 사용하는 것입니다.

EXISTS 절은 두 번째 버전보다 원하는 것을 더 잘 나타냅니다.

+1

그러나이 대답은'EXISTS'와'COUNT'를 사용하는 두 가지 접근법을 비교합니까? –

+0

@TimSchmelter now 조금은;)하지만 그래, 먼저 뭔가 놓쳤다. –

2

exists 방법은 성능 측면에서 더 좋습니다. 일치하는 첫 번째 레코드를 발견하면 기본 테이블/쿼리 처리를 중지 할 수 있습니다.

count(*) 메서드는 실제로 레코드 수를 생성해야하므로 기본 테이블 스캔/쿼리를 완료해야합니다. 그런 다음 집계를 수행해야합니다.

예, 성능 차이가있을 수 있습니다. 1 억 개의 행을 가진 테이블을 가지고 있다고 가정하면 :

if exists (select 1 from table t) 

이것은 거의 즉시 반환됩니다.

if (select count(*) from table t) 

전체 테이블 스캔을 수행해야하므로 커피를 마셔야합니다.

exists을 사용하십시오.

관련 문제