programing

SQL JOIN과 IN의 퍼포먼스 비교

elecom 2023. 4. 8. 07:58
반응형

SQL JOIN과 IN의 퍼포먼스 비교

JOIN 또는 IN을 사용하여 올바른 결과를 얻을 수 있는 경우가 있습니다.일반적으로 어떤 것이 더 나은 성능을 가지며 그 이유는 무엇입니까?실행 중인 데이터베이스 서버에 따라 얼마나 달라집니까? (참고: MS SQL을 사용하고 있습니다.)

일반적으로 말하면IN그리고.JOIN서로 다른 결과를 얻을 수 있는 서로 다른 쿼리입니다.

SELECT  a.*
FROM    a
JOIN    b
ON      a.col = b.col

같지 않다

SELECT  a.*
FROM    a
WHERE   col IN
        (
        SELECT  col
        FROM    b
        )

,~하지 않는 한b.col는 유일합니다.

단, 이것은 첫 번째 쿼리의 동의어입니다.

SELECT  a.*
FROM    a
JOIN    (
        SELECT  DISTINCT col
        FROM    b
        )
ON      b.col = a.col

결합 컬럼이 다음과 같은 경우UNIQUE그리고 그렇게 마크된 두 쿼리는 모두 같은 계획을 생성합니다.SQL Server.

그렇지 않으면IN보다 빠르다JOINDISTINCT.

퍼포먼스에 대한 자세한 내용은 블로그에서 다음 기사를 참조하십시오.

이 스레드는 꽤 오래되었지만 여전히 자주 언급됩니다.제 취향으로는 조금 불완전합니다.왜냐하면 exists 키워드로 데이터베이스에 문의할 수 있는 방법이 있기 때문입니다.

따라서 테이블의 값에만 관심이 있는 경우 다음 쿼리를 사용할 수 있습니다.

SELECT  a.*
FROM    a
WHERE   EXISTS (
    SELECT  *
    FROM    b
    WHERE   b.col = a.col
    )

col이 색인화되지 않은 경우 차이가 클 수 있습니다.db는 col 값이 같은 모든 레코드를 b에서 찾을 필요가 없기 때문에 첫 번째 레코드만 찾으면 되기 때문입니다.b.col에 인덱스가 없고 b에 레코드가 많을 경우 테이블스캔이 발생할 수 있습니다.IN 또는 JOIN의 경우 전체 테이블스캔이 됩니다.EXIST의 경우 부분 테이블스캔에 불과합니다(첫 번째 일치하는 레코드가 발견될 때까지).

b에 동일한 col 값을 가진 레코드가 많을 경우 조건이 충족되는지 확인하기 위해 이러한 레코드를 모두 임시 공간에 읽기 위한 메모리도 많이 낭비됩니다.존재하면 일반적으로 이를 피할 수 있습니다.

인덱스가 있어도 IN보다 ENSITES를 더 빨리 발견하는 경우가 많습니다.데이터베이스 시스템(최적화기), 데이터 및 마지막으로 사용되는 인덱스의 유형에 따라 달라집니다.

어느 쪽이 더 잘 작동하는지를 실제로 알아내기 위해서는 실제로 실행 시간을 프로파일링해야 합니다.

일반적으로 외부 키 열에 인덱스가 있고 INSER JOIN 조건만(또는 대부분) 사용하고 있다면 JOIN이 약간 빨라질 것입니다.

그러나 OUTER JOIN을 사용하기 시작하거나 외부 키 인덱스가 부족한 경우 IN이 더 빠를 수 있습니다.

마크

논리적 차이에 대한 흥미로운 기록:SQL Server: JOIN vs IN vs EXISTES - 논리적 차이

관계나 인덱스가 유지되고 있다고 하면, 참가의 퍼포먼스가 전반적으로 향상한다고 생각합니다(다른 작업보다 더 많은 노력이 투입됩니다).개념적으로 생각해 보면 2개의 쿼리와 1개의 쿼리의 차이입니다.

Query Analyzer에 연결하여 사용해 보고 차이를 확인해야 합니다.쿼리 실행 계획도 살펴보고 단계를 최소화해 보십시오.

각 데이터베이스의 구현은 공통적인 문제를 거의 동일한 방식으로 해결할 수 있습니다.MSSQL을 사용하는 경우 생성된 실행 계획을 확인하십시오.프로파일러 및 실행 계획을 켜면 이 작업을 수행할 수 있습니다.명령어를 실행하면 텍스트버전이 표시됩니다.

어떤 버전의 MSSQL을 사용하고 있는지 알 수 없지만 SQL Server 2000에서 쿼리 아나라이저로 그래피컬한 버전을 얻을 수 있습니다.이 기능은 SQL Server Studio Manager 이후 버전의 어딘가에 숨어 있을 것입니다.

제적 계획을 보세요.테이블이 작지 않은 경우 테이블스캔이 인덱스를 사용하는 경우보다 빠르지 않으면 가능한 한 테이블스캔을 피합니다.각 시나리오에 따라 생성되는 다양한 가입 조작에 대해 자세히 설명합니다.

Optimizer는 일반 쿼리에 대해 동일한 결과를 얻을 수 있을 정도로 스마트해야 합니다.실행 계획을 확인하면 동일한 내용을 제공받을 수 있습니다.그렇지 않으면 보통 JOIN이 더 빠르다고 생각합니다.다만, 시스템은 모두 다르기 때문에, 확실히 하기 위해서, 시스템의 코드를 프로파일 할 필요가 있습니다.

언급URL : https://stackoverflow.com/questions/1200295/sql-join-vs-in-performance

반응형