2017-11-27 6 views
0

에서 선택 * 실행 대 NOT 기본적으로 보이는 쿼리를 존재하는 나는이 다음SELECT COUNT (*) 테라 데이타

select count(*) 
from TableA a 
where not exists (Select 1 from TableB b where a.ID = b.ID); 

TableA의는

하면 TableB의

같은 약 8,562,212 기록을 가지고 I 위 쿼리를 실행하면 무기한 실행됩니다. 내가 함께
select count(*) 

를 교체 할 때 단지

select * 

쿼리는 2 초에서 실행 (예상대로) 0 행을 반환합니다. 또한 내가 존재하지 않는 곳에 역행 (TableB가 없으면 .... TableA), count (*)를 사용하여 2 초 후에 실행하고 0 행을 반환합니다.

유일한 문제는 위의 쿼리입니다. 나는 많은 DB 테이블에서 비슷한 쿼리를 실행하고 결코이 문제를 다루지 않는다고 덧붙일 것이다. 이것이 일어날 수있는 이유는 무엇입니까? 나는 곤두박질 친다. 감사합니다

+0

두 테이블 모두 id 열을 기준으로 기본 인덱스가 필요합니다. –

+0

설명을 게시 할 수 있습니까? – dnoeth

답변

1

왼쪽 가입을 시도 했습니까?

select count(*) 
from TableA a 
LEft join TableB b on a.ID = b.ID 
where b.ID is null 
+0

그게 효과가있다. MINUS 쿼리를 사용하여이 특정 테이블 비교를 처리하기 위해 카운트 (*)를 래핑했습니다. 다른 모든 것은 잘 작동합니다. 그래서 이상한. 감사합니다 – JD2775

+0

나는 보통 존재하지 않는 쿼리 대신에 왼쪽의 조인을 사용합니다. 나는 당신에게 도움이 되었기 때문에 기쁩니다. – Markov