문제

다음 중 어느 것이 더 효율적인지 궁금합니다.

나는 항상 사용에 대해 약간 조심했습니다 IN SQL Server가 결과 세트를 큰 것으로 바꾸겠다고 생각하기 때문에 IF 성명. 큰 결과 세트의 경우 성능이 저하 될 수 있습니다. 소규모 결과 세트의 경우 어느 쪽이든 바람직하지 않습니다. 큰 결과 세트의 경우 그렇지 않습니다 EXISTS 더 효율적입니까?

WHERE EXISTS (SELECT * FROM Base WHERE bx.BoxID = Base.BoxID AND [Rank] = 2)

vs.

WHERE bx.BoxID IN (SELECT BoxID FROM Base WHERE [Rank = 2])
도움이 되었습니까?

해결책

EXISTS 엔진이 히트를 발견하면 조건이 사실로 판명되면서 종료 될 것입니다.

와 함께 IN, 추가 처리 전에 하위 쿼리의 모든 결과를 수집합니다.

다른 팁

허용 된 답변은 근시안적이며 질문은 다음과 같이 약간 느슨합니다.

1) 덮개 지수가 왼쪽, 오른쪽 또는 양쪽에 있는지 명시 적으로 언급하지 않습니다.

2) 입력 왼쪽 세트의 크기와 입력 오른쪽 세트의 크기를 고려하지 않습니다.
(질문은 전체적으로 큰 것을 언급합니다 결과 세트).

나는 (1)과 (2)로 인한 상당한 비용 차이가있을 때 "in"vs "존재"사이를 전환 할 수있을 정도로 똑똑하다고 생각합니다. 그렇지 않으면 힌트로 사용될 수 있습니다 (예 : 사용을 장려하기 위해 존재합니다. 오른쪽에서 찾을 수있는 지수).

두 양식 모두 내부적으로 결합 양식으로 변환하고, Join Order를 역전시키고, 추정 행 카운트 (왼쪽 및 오른쪽) 및 왼쪽, 오른쪽 또는 양쪽의 인덱스 존재에서 루프, 해시 또는 병합 기반으로 실행할 수 있습니다.

SQL Server 2005 및 2008에 대해 약간의 테스트를 수행했으며, 다른 것과 같은 실제 실행 계획과 함께 존재하고 다른 것들이 언급 한 것과 정확히 동일한 실제 실행 계획으로 돌아옵니다. 최적화기는 최적입니다. :)

쿼리를 바로 표현하지 않으면 알아야 할 것이 있습니다. http://weblogs.sqlteam.com/mladenp/archive/2007/05/18/60210.aspx

나는 함께 갈 것입니다. 아래 링크를 참조하십시오.

SQL Server : vs in vs in vs가 존재합니다 - 논리적 차이

실행 계획은 일반적으로 이러한 경우 동일하지만 인덱스 등의 다른 모든 측면에서 최적화가 어떻게 인수를 볼 때까지, 당신은 실제로 알지 못할 것입니다.

따라서 In은 존재하는 것과 동일하지 않으며 동일한 실행 계획을 생성 할 것입니다.

일반적으로 존재하는 것은 상관 관계 서브 쿼리에 사용되므로 외부 쿼리와 함께 존재하는 내부 쿼리에 결합됩니다. 이렇게하면 외부 쿼리 조인을 해결하고 내부 쿼리 조인을 해결해야하므로 결과를 생성하는 단계가 더 추가됩니다.

일반적으로 Inner Query를 외부 쿼리와 연관시키지 않고 사용되며 한 단계 (최상의 시나리오에서) 만 해결할 수 있습니다.

이걸 고려하세요:

  1. Inner Query 결과가 수백만 행의 고유 한 값 인 경우, 쿼리가 수행된다는 점에서 존재하는 것보다 느리게 수행 될 수 있습니다 (외부 쿼리와 결합 할 올바른 색인이 있음).

  2. 사용하는 것이 존재하고 외부 쿼리와의 결합이 복잡한 경우 (수행하는 데 더 많은 시간이 걸리고 적절한 색인이 필요하지 않음) 외부 테이블의 행 수로 쿼리 속도를 늦추고 때로는 완료 할 예정 시간이 며칠 내에있을 수 있습니다. 주어진 하드웨어에 행 수를 허용 할 수 있거나 데이터의 카디널리티가 정확한 경우 (예를 들어 큰 데이터 세트의 뚜렷한 값이 적음) 존재하는 것보다 더 빨리 수행 할 수 있습니다.

  3. 위의 모든 내용은 각 테이블에 상당한 양의 행이있을 때 기록됩니다 (공정한 경우 CPU 처리 및/또는 캐싱을위한 RAM 임계 값을 초과하는 것을 의미합니다).

따라서 대답은 달라집니다. 당신은 내부에 복잡한 쿼리를 작성하거나 존재하지만, 경험상 제한된 뚜렷한 값 세트와 함께 사용해야하며 고유 한 값을 가진 많은 행이있을 때 존재합니다.

트릭은 스캔 할 행의 수를 제한하는 것입니다.

문안 인사,

마리아 노크

최적화합니다 EXISTS, 매우 문자 그대로; 무언가가 거기에 있어야하지만 실제로 상관 된 하위 쿼리에서 반환 된 데이터가 필요하지 않습니다. 당신은 단지 부울 상태를 평가하고 있습니다.

그래서:

WHERE EXISTS (SELECT TOP 1 1 FROM Base WHERE bx.BoxID = Base.BoxID AND [Rank] = 2)

상관 관계가있는 하위 쿼리이기 때문입니다 RBAR, 첫 번째 결과는 조건을 사실로 만들고 더 이상 처리되지 않습니다.

여기에는 고도로 반전 된 것들을 포함하여 많은 오해의 소지가있는 답변이 있습니다 (나는 그들의 작전이 해를 끼치지는 않다고 생각하지만). 짧은 대답은 다음과 같습니다. 이것들은 동일합니다.

(t-) SQL 언어에는 많은 키워드가 있지만 결국 하드웨어에서 실제로 발생하는 유일한 것은 실행 쿼리 계획에서 볼 수있는 작업입니다.

우리가 호출 할 때 우리가하는 관계 (수학 이론) 운영 [NOT] IN 그리고 [NOT] EXISTS 반 결합입니다 (사용시 반 결정 NOT). 해당 SQL-Server 작업이 가지고있는 것은 우연의 일치가 아닙니다. 같은 이름. 언급하는 수술은 없습니다 IN 또는 EXISTS 어디서나 - (안티) 반 결합. 따라서, 논리적으로 동등한 방법은 없습니다 IN vs EXISTS 선택은 결과를 얻기위한 (안티) 반입 실행 작업이 하나 있고 유일한 방법이 있기 때문에 성능에 영향을 줄 수 있습니다..

An example:

쿼리 1 ( 계획 )

select * from dt where dt.customer in (select c.code from customer c where c.active=0)

쿼리 2 ( 계획 )

select * from dt where exists (select 1 from customer c where c.code=dt.customer and c.active=0)

내 머리 꼭대기에서 옳지 않다고 보장되지 않습니다.이 경우 두 번째가 더 빠를 것이라고 생각합니다.

  1. 첫 번째로, 상관 된 서브 쿼리는 각 행에 대해 하위 쿼리가 실행 될 수 있습니다.
  2. 두 번째 예에서는 하위 쿼리가 상관 관계가 없기 때문에 한 번만 실행해야합니다.
  3. 두 번째 예에서 IN 일치를 찾는 즉시 단락됩니다.
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top