SQL Server IN과 기존 성능 비교
다음 중 어떤 것이 더 효율적일까?
항상 조심스러웠는데IN를 큰 Server로 수 있다고 입니다.IF가 퍼포먼스가될 수 있습니다.결과 세트가 클 경우 성능이 저하될 수 있습니다.작은 결과 세트의 경우 어느 쪽도 바람직하지 않습니다.큰 결과 세트의 경우,EXISTS★★★★★★★★★★★★★★★★★★★?
WHERE EXISTS (SELECT * FROM Base WHERE bx.BoxID = Base.BoxID AND [Rank] = 2)
대.
WHERE bx.BoxID IN (SELECT BoxID FROM Base WHERE [Rank = 2])
EXISTS일단 엔진이 히트를 발견하면 상태가 사실로 판명된 것처럼 보이지 않게 되기 때문에 더 빠를 것입니다.
★★★★★★★★★★★★★★★★ IN처리 전 하위 항목에서 모든 결과를 수집합니다.
받아들여지는 대답은 근시안적이며, 그 점에서 질문은 다소 느슨하다.
1) 왼쪽, 오른쪽, 양쪽 모두에 커버리지수가 존재하는지 명시하지 않는다.
2).2) 입력 우측 세트의 사이즈는 고려되지 .
(질문에서는 전체적으로 큰 결과 세트를 언급하고 있습니다).
옵티마이저는 (1)과 (2)로 인해 큰 비용 차이가 있을 때 "in"과 "exists" 사이를 변환할 수 있을 만큼 똑똑하다고 생각합니다.그렇지 않으면 힌트로 사용할 수 있습니다(예를 들어 오른쪽에 탐색 가능한 인덱스를 사용하도록 권장하기 위해 존재합니다).
두 양식 모두 내부적으로 조인 형식으로 변환하고 조인 순서를 반대로 하며 예상 행 수(왼쪽과 오른쪽)와 왼쪽, 오른쪽 또는 양쪽의 인덱스 존재에 따라 루프, 해시 또는 병합으로 실행할 수 있습니다.
SQL Server 2005와 2008에서 몇 가지 테스트를 실시했습니다.또, EXIST와 IN의 양쪽 모두에 대해서, 전술한 것과 같은 실제의 실행 계획을 가지고 있습니다.Optimizer가 최적입니다.:)
단, 문의 문구를 올바르게 표현하지 않으면 EXISTS, IN 및 JOIN에서 다른 결과가 반환될 수 있습니다.http://weblogs.sqlteam.com/mladenp/archive/2007/05/18/60210.aspx
EXISTS over IN으로 하겠습니다.아래 링크를 참조해 주세요.
SQL Server: JOIN vs IN vs EXISTES - 논리적 차이
IN은 반환된 결과에 대해 EXISTS 또는 JOIN과 동일하게 동작한다는 일반적인 오해가 있습니다.이것은 전혀 사실이 아니다.
IN: 지정한 값이 하위 쿼리 또는 목록의 값과 일치하는 경우 true를 반환합니다.
Exists: 하위 쿼리에 행이 포함되어 있으면 true를 반환합니다.
결합: 결합 열의 결과 집합 2개를 결합합니다.
블로그 크레딧 : https://stackoverflow.com/users/31345/mladen-prajdic
여기에는 오해의 소지가 있는 답변이 많이 있습니다.여기에는 높은 투표율을 기록한 답변도 포함되어 있습니다(비록 그들의 작전이 해를 끼친다고는 생각하지 않습니다).간단한 답변은 다음과 같습니다. 이것도 똑같아요.
(T-)SQL 언어에는 많은 키워드가 있지만 결국 하드웨어에서 실제로 발생하는 것은 실행 쿼리 계획에서 볼 수 있는 조작뿐입니다.
을 호출할 때 [NOT] IN ★★★★★★★★★★★★★★★★★」[NOT] EXISTS는 세미조인(semi join을 사용할 )입니다.NOT대응하는 sql-server 조작의 이름이 같은 것은 우연이 아닙니다.를 나타내는 조작은 없습니다.IN ★★★★★★★★★★★★★★★★★」EXISTS모든 위치 - (안티)무선 결합만 가능합니다.따라서 논리적으로 동등한 vs 선택이 퍼포먼스에 영향을 미칠 가능성은 없습니다.이는 결과를 얻기 위한 유일한 방법인 (반)세미 조인 실행 조작이 있기 때문입니다.
예:
쿼리 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)
일반적으로 이러한 경우 실행 계획은 동일하지만 인덱스의 다른 모든 측면에서 옵티마이저가 어떻게 작용하는지 확인할 때까지는 알 수 없습니다.
따라서 IN은 EXIST와 동일하지 않으며 동일한 실행 계획을 생성하지 않습니다.
일반적으로 EXISTES는 연관된 하위 쿼리에서 사용됩니다. 즉, EXISTES 내부 쿼리와 외부 쿼리를 결합합니다.외부 쿼리 조인을 해결하고 내부 쿼리 조인을 해결한 후 where 구를 일치시켜 두 조인을 모두 수행해야 하므로 더 많은 단계를 추가하여 결과를 생성합니다.
보통 IN은 내부 쿼리와 외부 쿼리를 관련짓지 않고 사용되며, 이는 한 단계로 해결할 수 있습니다(최적의 경우).
다음 사항을 고려하십시오.
IN을 사용하여 내부 쿼리 결과가 수백만 행의 고유 값일 경우 EXIST 쿼리가 수행되므로(외부 쿼리와 결합할 수 있는 올바른 인덱스가 있음) 기존 쿼리보다 느리게 수행됩니다.
EXISTS를 사용하고 외부 쿼리와 결합이 복잡할 경우(실행 시간이 길어지고 적절한 인덱스가 없음), 외부 테이블의 행 수만큼 쿼리가 느려집니다.종료까지의 예상 시간이 일수가 될 수 있습니다.지정된 하드웨어에 대해 행 수가 허용 가능한 경우 또는 데이터의 카디널리티가 올바른 경우(예를 들어 대규모 데이터 세트의 DISTINT 값이 적은 경우) IN은 기존보다 더 빠르게 수행할 수 있습니다.
위의 모든 것은 각 테이블에 상당한 양의 행이 있는 경우에 알 수 있습니다(정확히 말하면 캐싱의 CPU 처리 및/또는 RAM 임계값을 초과하는 것을 의미합니다).
답은 의존합니다.IN 또는 EXISTES 내부에 복잡한 쿼리를 작성할 수 있지만, 경험상 IN은 한정된 고유값 집합과 함께 사용해야 하며, 고유값이 많은 행이 많을 때는 EXISTES를 사용해야 합니다.
요령은 스캔할 행의 수를 제한하는 것입니다.
안부 전해요,
마리아노C
를 최적화하려면EXISTS문자 그대로입니다.뭔가가 있어야 하지만 실제로 관련된 하위 항목에서 데이터를 반환할 필요는 없습니다.부울 조건을 평가하고 있을 뿐입니다.
그래서:
WHERE EXISTS (SELECT TOP 1 1 FROM Base WHERE bx.BoxID = Base.BoxID AND [Rank] = 2)
관련된 서브쿼리는RBAR첫 번째 결과 적중 시 조건이 true가 되고 더 이상 처리되지 않습니다.
아주 오래된 질문인 건 알지만 제 답변에 몇 가지 팁이 추가될 것 같아요.
방금 mssqltips sql exists vs in vs join에 관한 블로그를 발견했습니다.이 블로그는 일반적으로 동일한 퍼포먼스에 적합한 것으로 나타났습니다.
그러나 둘 중 하나와 다른 것의 단점은 다음과 같습니다.
그
in스테이트먼트에는 하나의 열에 있는 두 테이블만 비교할 수 있다는 단점이 있습니다.그
join스테이트먼트는 중복된 값으로 실행됩니다.in그리고.exists중복은 무시됩니다.
하지만 실행 시간을 보면 큰 차이가 없습니다.
흥미로운 것은, 이 파일을 작성했을 때index테이블 위에 있는,join더 좋아요.
그리고 나는 생각한다join특히 새로 온 사람들에게 더 쉽게 쓰고 이해할 수 있다는 또 다른 장점이 있습니다.
즉석에서 정확하다고 장담할 수 없다: 나는 이 경우에 두 번째가 더 빠를 것이라고 믿는다.
- 첫 번째, 관련된 서브쿼리에 의해 각 행에 대해 서브쿼리가 실행될 수 있습니다.
- 두 번째 예에서는 상관관계가 없기 때문에 서브쿼리는 한 번만 실행해야 합니다.
- 두 번째 예에서는
IN일치하는 것을 발견하면 바로 단락됩니다.
언급URL : https://stackoverflow.com/questions/2065329/sql-server-in-vs-exists-performance
'programing' 카테고리의 다른 글
| Excel 워크북이 이미 열려 있는지 감지 (0) | 2023.04.10 |
|---|---|
| NSString 값을 NSData로 변환하려면 어떻게 해야 합니까? (0) | 2023.04.10 |
| 배치 파일 내의 출력 리다이렉트 (0) | 2023.04.10 |
| PowerShell에서 출력하는 방법 (0) | 2023.04.10 |
| Excel VBA 비밀번호 해시 함수 (0) | 2023.04.10 |