복붙노트

[SQL] NOT이있는 대 LEFT OUTER에 SQL 성능 가입

SQL

NOT이있는 대 LEFT OUTER에 SQL 성능 가입

나는 테이블 B의 테이블 A의 항목의 설정이 아닌를 찾으려면, 내가 사용할 수 있습니다 LEFT OUTER은 가입 또는 NOT 존재한다. 나는 SQL Server가 ANSI으로하고 LEFT OUTER 조인 일부 경우에 설치된다 들었어요하는 것은 존재보다 훨씬 더 효율적입니다. 윌 ANSI이 경우에 더 잘 수행 가입? 및 연산자는 NOT SQL 서버에 일반적으로 존재하는 것보다 더 효율적으로 가입되어있다?

해결법

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

    1.조의 링크는 좋은 출발점이다. Quassnoi도이 문제를 다룹니다.

    조의 링크는 좋은 출발점이다. Quassnoi도이 문제를 다룹니다.

    당신의 필드가 제대로 색인 경우 일반적으로, 또는 당신이 (즉, 서브 쿼리에 존재하는 행의 제비가) 이상의 레코드를 필터링 할 것으로 예상되는 경우 NOT EXISTS 더 나은 수행합니다.

    존재하지 두 단락 존재 - 즉시 레코드가 다음 레코드에 어느 포함 또는 필터링 년대 기준 및 최적화의 움직임과 일치한다.

    LEFT는 관계없이 일치 여부에 모든 레코드에 가입 일치하지 않는 모든 기록을 걸러 가입하세요. 테이블이 큰 및 / 또는 여러 가지고 기준을 가입하는 경우이 아주 많은 자원이 될 수 있습니다.

    나는 일반적으로 NOT이 존재하고 가능한 EXISTS를 사용하려고합니다. SQL 서버, IN과 NOT IN을 위해 의미 상 동일 및 쓰기에보다 쉽게 ​​할 수있다. 이 짧은 회로에 보장 SQL 서버에서 찾을 수있는 유일한 사업자 중입니다.

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

    2.내가 SQL Server에 대한이 주제에 읽은 가장 좋은 논의는 여기에있다.

    내가 SQL Server에 대한이 주제에 읽은 가장 좋은 논의는 여기에있다.

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

    3.개인적으로, 나는이 하나가, "상황에 따라 다르다"오래된 큰 얻을 수 있다고 생각합니다. 나는 각 방법은 다른 상회 한 경우를 본 적이있다.

    개인적으로, 나는이 하나가, "상황에 따라 다르다"오래된 큰 얻을 수 있다고 생각합니다. 나는 각 방법은 다른 상회 한 경우를 본 적이있다.

    가장 좋은 건 모두를 테스트하고 더 나은 어떤 수행을 볼 수있다. 이 테이블은 항상 작은 것 및 성능 그때 난 그냥 (즉, 대부분의 사람들을 위해 존재 보통이 아니다) 중 당신에게 깨끗한입니다 가서 이동 것 중요로서가 아닌 상황이 있다면.

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

    4.이 블로그 항목 (NOT IN, 외부 적용, LEFT OUTER 조인를 제외하고는 NOT EXISTS) 다양한 방법의 예제를 제공합니다 같은 결과를 달성하고하지 않음 (왼쪽 안티 세미 가입)이 차가운 캐시와 따뜻한 캐시 모두에서 최고의 옵션이다 존재 증명 시나리오.

    이 블로그 항목 (NOT IN, 외부 적용, LEFT OUTER 조인를 제외하고는 NOT EXISTS) 다양한 방법의 예제를 제공합니다 같은 결과를 달성하고하지 않음 (왼쪽 안티 세미 가입)이 차가운 캐시와 따뜻한 캐시 모두에서 최고의 옵션이다 존재 증명 시나리오.

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

    5.나는 우리가 우리가 OP 설명 이러한 경우에서 삭제하는 테이블에 인덱스를 사용하는 방법에 대해 궁금했는데.

    나는 우리가 우리가 OP 설명 이러한 경우에서 삭제하는 테이블에 인덱스를 사용하는 방법에 대해 궁금했는데.

    우리가 말 :

     table EMPLOYEE (emp_id int, name varchar) 
    and
     table EMPLOYEE_LOCATION (emp_id int, loc_id int)
    

    내 실제 예에서 내 테이블이 훨씬 넓은하고 100 만 개 + 행을 포함, 나는 예를 목적으로 스키마를 단순화했다.

    나는 분명히 왼쪽 외부 기술 또는 NOT IN을 사용하여 EMPLOYEE에 EMP_ID의 대응이없는 EMPLOYEE_LOCATION의 행을 삭제할하지만 난 궁금하면 ...

    두 테이블을 사용하려고 시도하는 것이 가치가있을 것입니다 다음 EMP_ID의 열을 선도 인덱스가 있다면?

    아마도 나는 EMP_ID가 임시 테이블에 EMPLOYEE_LOCATION 출신, 직원에서 EMP_ID의 당겨 내가 삭제를 임시 테이블에서 EMP_ID의를 얻을 수 있습니다.

    나는 이들 EMP_ID의 라운드주기 실제로는과 같이 인덱스를 사용할 수 있습니다 :

    loop for each emp_id X to delete -- (this would be a cursor)
     DELETE EMPLOYEE_LOCATION WHERE emp_id = X
    

    나는 커서 오버 헤드가 알고 있지만 명시 적으로 인덱스를 사용하는 것이 바람직하다 생각 때문에 내 실제 예제에서 나는 큰 테이블을 취급하고 있습니다.

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

    6.나는 NOT에 나타났습니다 예외가 연결된 서버를 사용하는 경우 WHERE NULL이된다 ... 우수한 (그러나 변두리)에서 왼쪽으로 가입되는 존재한다.

    나는 NOT에 나타났습니다 예외가 연결된 서버를 사용하는 경우 WHERE NULL이된다 ... 우수한 (그러나 변두리)에서 왼쪽으로 가입되는 존재한다.

    실행 계획을 검토에서, NOT 연산자는 중첩 루프 방식으로 실행됩니다 존재가 나타납니다. 이 행 단위로 실행된다 (I 만든다 감각을 가정한다).

    예 실행 계획이 동작을 보여 :

  7. from https://stackoverflow.com/questions/6777910/sql-performance-on-left-outer-join-vs-not-exists by cc-by-sa and MIT license