인덱스와 관련하여 NOT 로직 사용


12

데이터베이스 개발 시험 70-433 에 대한 Microsoft의 저서에 따르면 : Microsoft SQL Server 2008 데이터베이스 개발 :

나도 와일드 카드 문자를 선도하는 것은 NOT 논리는 쿼리 최적화는 검색을 최적화하기 위해 인덱스를 사용할 수 없습니다. 최적의 성능을 위해서는 NOT 키워드와 선행 와일드 카드 기호를 사용 하지 않아야 합니다.

그 일에 갔다 나는 그래서 NOT IN, NOT EXISTS

이제이 SO 질문 과 관련하여 @GBN이 선택한 솔루션이 위의 진술을 위반한다고 생각했습니다.

분명히 그렇지 않습니다.

내 질문은 : 왜?

답변:


21
  • NOT IN (SELECT ...)NOT EXISTS (SELECT .. WHERE correlation..)"안티 세미 조인"입니다. 즉, 인식 된 세트 기반 작업

  • WHERE NOT (MyColumn = 1) 모든 행을 확인해야하는 필터입니다.

자세한 내용은 다음을 참조하십시오.

편집 : 완전성

왼쪽 조인은 종종 성능이 저하됩니다. http://explainextended.com/2009/09/15/not-in-vs-not-exists-vs-left-join-is-null-sql-server를 참조하십시오 .

동일한 사이트에서 MySQL의 NOT EXISTS는 다른 RDBMS와 같이 최적화되지 않으며 LEFT JOIN이 더 좋습니다.

SQL Server에서 LEFT JOIN이 실행되지 않고 존재하지 않는다는 경험을 알고 있습니다. 다른 처리 단계와 동일한 결과를 얻으려면 종종 DISTINCT가 필요합니다.


0

나는 이것을 위해 하위 선택을 사용합니다 :

SELECT m* from Main AS m 
    WHERE m.id NOT IN 
        (SELECT m2.id FROM Main AS m2 
           WHERE m2.id IN (...possibly null/empty list goes here...));

물론 테이블이 큰 경우 성능을 확인하기 위해이를 분석해야합니다. 기본 쿼리에서 결과를 필터링하는 추가 절이 있으면 하위 선택에서 복제해야 할 수 있습니다. 그러나 하위 선택은 "IN"대 "NOT IN"을 가지므로 크기 결과가 다르고 일반적으로 쿼리 성능 문제가 있으므로 큰 테이블과 함께 사용할 때이 방법을 분석하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.