source

존재함/존재하지 않음: 'select 1' vs 'select field'

ittop 2023. 7. 6. 22:45
반응형

존재함/존재하지 않음: 'select 1' vs 'select field'

두 가지 중 어느 것이 더 나은 성능을 발휘할 것인가(나는 Oracle에서 후자를 사용했기 때문에 최근에 코드를 조심하지 않았다는 이유로 비난을 받았습니다):

Select * 
from Tab1
Where (not) exists(Select 1 From Tab2 Where Tab1.id = Tab2.id)


Select * 
from Tab1
Where (not) exists(Select Field1 From Tab2 Where Tab1.id = Tab2.id)

아니면 둘 다 같은 건가요?

SQL Server 관점과 Oracle 관점 모두에서 답변해 주시기 바랍니다.

(대부분 sql-server 측에서) 구글을 검색해 본 결과, 현재 제 의견/가정은 RDMBS의 옵티마이저가 하위 쿼리에서 필요한 모든 것이 부울 값이라는 것을 이해할 수 있을 정도로 충분히 성숙하다는 것이지만, 이에 대한 많은 논쟁이 여전히 존재한다는 것을 알게 되었습니다.

네, 그들은 같습니다. exists하위 쿼리에 행이 하나 이상 있는지 확인합니다.만약 그렇다면, 그것은 평가합니다.true하위 쿼리의 열은 어떤 식으로든 중요하지 않습니다.

MSDN에 따르면,exists:

행이 있는지 테스트할 하위 쿼리를 지정합니다.

Oracle:

EXISTANS 조건은 하위 쿼리에 있는 행의 존재를 테스트합니다.

MySQL 문서는 다음과 같이 훨씬 더 설명할 수 있습니다.

전통적으로 EXISTANS 하위 쿼리는 SELECT *로 시작하지만 SELECT 5 또는 SELECT column1로 시작할 수 있습니다. MySQL은 이러한 하위 쿼리의 SELECT 목록을 무시하므로 아무런 차이가 없습니다.

이것이 오래된 것이라는 것을 알지만, 최근에 제가 관찰한 몇 가지 요점을 추가하고 싶습니다.

존재 여부만 확인하는 경우에도 "select *" all이라고 쓰면 열이 확장됩니다. 이 약간의 오버헤드를 제외하고는 차이가 없습니다.

출처:
http://www.sqlskills.com/blogs/conor/exists-subqueries-select-1-vs-select/

업데이트:
제가 언급한 기사는 유효하지 않은 것 같습니다.비록 우리가 글을 쓸 때,select 1,SQL Server가 모든 열을 확장합니다.

다양한 접근법을 사용할 경우 상세 분석 및 성능 통계는 아래 링크를 참조하십시오.

1개 또는 1개를 사용하는 하위 쿼리 *

하위 쿼리의 열 목록에 있는 식은 전혀 중요하지 않으며 실행되지도 않습니다.

select * from dual t1
where exists (
    select 1/0 from dual t2
         --^^^ division by 0  
    where t2.dummy = t2.dummy)
/

DUMMY
--------
X

경험상 "EXISTS(SELECT **)"와 "EXISTS(SELECT 1...")를 사용할 때 주의해야 할 점은 스키마 바운드 개체에서 "*"를 사용할 수 없다는 것입니다. 이 개체는 다음을 던집니다.

스키마 바인딩된 개체에는 '*' 구문을 사용할 수 없습니다.

언급URL : https://stackoverflow.com/questions/26461868/exists-not-exists-select-1-vs-select-field

반응형