복붙노트

[SQL] SQL은 IN 성능 대 가입?

SQL

SQL은 IN 성능 대 가입?

JOIN을 사용하여 어디 사건이 있거나 IN 나에게 일반적으로 더 나은 성능과 이유를 가지고 올바른 결과를 ... 줄 것이다? 얼마나 당신이 실행중인 데이터베이스 서버에 의존 하는가? (참고로 내가 사용하고 MSSQL)

해결법

  1. ==============================

    1.일반적으로, IN 말하기 및 가입은 서로 다른 결과를 얻을 수있는 다른 쿼리입니다.

    일반적으로, IN 말하기 및 가입은 서로 다른 결과를 얻을 수있는 다른 쿼리입니다.

    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 빠른 DISTINCT에 가입하기보다는이다.

    성능 자세한 내용은 내 블로그에서이 문서를 참조하십시오 :

  2. ==============================

    2.당신이 언급 재미, 나는이 매우 주제에 대한 블로그 게시물을했다.

    당신이 언급 재미, 나는이 매우 주제에 대한 블로그 게시물을했다.

    SQL 서버 대 MySQL의 대 오라클을 참조하십시오 집계 대 조인

    짧은 답변 : 당신이 그것을 테스트해야하고 개별 데이터베이스는 많이 다릅니다.

  3. ==============================

    3.즉 오히려 어렵다 - 실제로 실행 시간을 프로파일 링하기 위해 정말 좋은 어느 작품을 찾아, 당신은 필요한 것입니다.

    즉 오히려 어렵다 - 실제로 실행 시간을 프로파일 링하기 위해 정말 좋은 어느 작품을 찾아, 당신은 필요한 것입니다.

    엄지 손가락의 일반적으로, 당신은 당신의 외래 키 컬럼에 인덱스가 있다면 생각, 당신은 (또는 대부분)를 사용하는 경우 INNER는, 다음은 가입 약간 빨라집니다 조건 가입하세요.

    그러나 바로이 OUTER를 사용하기로 가입하거나, 외래 키 인덱스를 결여하는 경우는 IN 빨리 될 수 있습니다.

    즙을 짜고 난 찌꺼기

  4. ==============================

    4.논리적 차이에 흥미 작성자 : SQL 서버 : EXISTS 대 IN 대 가입 - 논리적 차이

    논리적 차이에 흥미 작성자 : SQL 서버 : EXISTS 대 IN 대 가입 - 논리적 차이

    나는 관계 및 인덱스가 (더 많은 노력이 그 작업을 한 후 다른 작업으로 이동) 전체 실적이 좋을 가입 유지된다고 가정 꽤 있는지입니다. 당신은 개념적으로 다음에 대해 2 개 쿼리 1 개 쿼리 사이의 차이를 생각한다면.

    당신은 쿼리 분석기로를 연결하고 그것을 시도하고 차이를 볼 필요가있다. 또한 쿼리 실행 계획을보고 단계를 최소화하려고합니다.

  5. ==============================

    5.이 스레드는 꽤 오래된하지만 여전히 자주 언급했다. (가) 내가 더 자주 못하는 것보다 더 빠른 것으로 확인 키워드 존재와 데이터베이스를 요구하는 또 다른 방법이 있기 때문에 내 개인적인 취향은 조금 불완전하다.

    이 스레드는 꽤 오래된하지만 여전히 자주 언급했다. (가) 내가 더 자주 못하는 것보다 더 빠른 것으로 확인 키워드 존재와 데이터베이스를 요구하는 또 다른 방법이 있기 때문에 내 개인적인 취향은 조금 불완전하다.

    당신은 단지 표 A의 값에 관심이 그렇다면 당신은이 쿼리를 사용할 수 있습니다 :

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

    COL 인덱싱되지 않은 경우 DB가 COL에 같은 값이 B의 모든 레코드를 찾을 수 없기 때문에 차이가 거대한 수 있습니다, 그것은 단지 최초의 하나를 찾을 수 있습니다. b.col에 인덱스 및 테이블 스캔이 결과 수 있습니다 B의 기록이 많이가없는 경우. (첫 번째 일치하는 레코드가 발견 될 때까지)이 부분적으로 만 테이블 스캔 것이 존재합니다 IN 또는 함께,이 전체 테이블 스캔 될 가입.

    당신은 또한 임시 공간으로 모든 기록을 읽어 메모리를 많이 낭비 같은 COL 값이 B 레코드의 많은 당신의 조건이 만족되는이 찾을 경우. 와이 보통 피할 수 존재한다.

    종종 발견 나는 인덱스가있는 경우에도 IN 빨리 다음 존재한다. 그것은 사용되는 인덱스의 종류에 마지막으로하지 적어도 데이터베이스 시스템 (최적화), 데이터에 따라 달라집니다.

  6. ==============================

    6.각 데이터베이스의 구현하지만, 당신은 아마 그들 모두가 더 많거나 적은 같은 방법으로 일반적인 문제를 해결할 수 있음을 추측 할 수있다. 당신은 MSSQL을 사용하는 경우 생성 된 실행 계획을 살펴 있습니다. 당신은 프로파일 러와 실행 계획을 설정하여이 작업을 수행 할 수 있습니다. 당신이 명령을 실행할 때 이렇게하면 텍스트 버전을 제공 할 것입니다.

    각 데이터베이스의 구현하지만, 당신은 아마 그들 모두가 더 많거나 적은 같은 방법으로 일반적인 문제를 해결할 수 있음을 추측 할 수있다. 당신은 MSSQL을 사용하는 경우 생성 된 실행 계획을 살펴 있습니다. 당신은 프로파일 러와 실행 계획을 설정하여이 작업을 수행 할 수 있습니다. 당신이 명령을 실행할 때 이렇게하면 텍스트 버전을 제공 할 것입니다.

    난 당신이 사용되지만 쿼리 분석기에서 SQL Server 2000에서 그래픽을 얻을 수 있습니다 MSSQL의 버전을 모르겠습니다. 나는이 기능은 이후 버전에서 SQL 서버 스튜디오 관리자에서 일부 어디 숨어 있음을 확신합니다.

    exeuction 계획에서보세요. 가능한 한 피하기 테이블 스캔과 같은 물론 테이블이 작은 경우를 제외하고이 경우 테이블 스캔 빠르게 인덱스를 사용하는 것보다. 다른 읽기 최대 각각 다른 시나리오를 생산하고 작업을 가입 할 수 있습니다.

  7. ==============================

    7.옵티마이 저는 스마트 충분히 당신에게 정상적인 쿼리에 대해 동일한 결과 중 하나 방법을 제시 할 수 있어야한다. 실행 계획을 확인하고 그들은 당신에게 같은 일을 제공해야합니다. 그렇지 않은 경우, 나는 일반적으로 빨리으로 가입을 고려한다. 당신이 있는지 시스템에서 코드를 프로파일 링해야하므로 모든 시스템은,하지만, 다르다.

    옵티마이 저는 스마트 충분히 당신에게 정상적인 쿼리에 대해 동일한 결과 중 하나 방법을 제시 할 수 있어야한다. 실행 계획을 확인하고 그들은 당신에게 같은 일을 제공해야합니다. 그렇지 않은 경우, 나는 일반적으로 빨리으로 가입을 고려한다. 당신이 있는지 시스템에서 코드를 프로파일 링해야하므로 모든 시스템은,하지만, 다르다.

  8. from https://stackoverflow.com/questions/1200295/sql-join-vs-in-performance by cc-by-sa and MIT license