2016-11-02 1 views
-2

IN은 정적 복합 쿼리 결과를 캐시 할 것인지 아니면 각 행에 대해 실행될 것인지 알고 싶습니다.복잡한 정적 선택에 대한 현재의 SQL Server 성능 비교 EXTYIST

SAMPLE은

이제
SELECT a.id, a.name 
FROM customer a 
WHERE a.id IN (SELECT b.customerId 
       FROM orders b 
       JOIN aricle c ON c.orderId = b.id 
       WHERE b.date = '20160910' and c.costcenter > 1000) 

, 서브 쿼리의 결과를 일시적으로 저장됩니다 또는 EXIST 빨리 이것에 대한 것입니까?

결과가 단지 몇 개의 행인 < 100이지만 쿼리가 훨씬 더 복잡 할 수 있다고 가정 해 봅시다!

나는이 경우 테이블에 가입 할 수도 있음을 알고 있지만 그 점은 중요하지 않습니다. 당신이 SQR의 행동에 특별히 관심이 있다면

내가 현재 SQL 서버의 동작에 특히 관심이

감사합니다 모두가

+0

나는 당신이 무엇을 요구하고 있는지 정확하게 이해하지 못합니다. 당신이 찾고있는 것이 무엇인지 명확하게 설명해 주시겠습니까? –

+0

SQL Server는 EXIST와는 대조적으로 값 집합을 찾고 있기 때문에 IN이 더 빠를 것이라고 생각합니다. EXIST에서는 각 값을 얻기 전에 각각의 값을 찾아야합니다. 이 쿼리에서는 어느 쪽도 조작에 너무 부담 스러울 것입니다. –

+0

기본적으로 테스트 할 데이터가 많은 경우'in'은 느리게 작동하고'exists'는 작동합니다. 만약 당신이 100 열을 말하는다면 아무런 차이가 없어야합니다. –

답변

0

을 :), 당신은 확인할 수 있으며, 데이터가 메모리에서 읽어 경우 참조 또는 SQL 문 앞에 다음 명령을 실행하여 디스크에서 가져옵니다.

SET STATISTICS IO ON 

논리적 및 물리적 읽기를 반환합니다.

논리적 읽기 : 논리적 읽기는 데이터 캐시에서 프로세스 쿼리에 액세스해야하는 총 데이터 페이지 수를 나타냅니다. 논리적 읽기가 동일한 데이터 페이지에 여러 번 액세스 할 가능성이 매우 높기 때문에 논리적 읽기 값의 수가 테이블의 실제 페이지 수보다 클 수 있습니다. 일반적으로 논리적 읽기를 줄이는 가장 좋은 방법은 올바른 인덱스를 적용하거나 쿼리를 다시 작성하는 것입니다.

물리적 읽기 물리적 읽기는 디스크에서 읽은 총 데이터 페이지 수를 나타냅니다. 데이터 캐시에 데이터가없는 경우 물리적 읽기는 논리적 읽기의 수와 같습니다. 그리고 대개 첫 번째 쿼리 요청이 발생합니다. 동일한 쿼리 요청에 대해 데이터 페이지가 데이터 캐시에 있으므로 숫자가 상당히 줄어 듭니다.

두 쿼리를 비교하려면 실행 계획을 사용하여 실행 시간을 확인하고 쿼리를 비교할 수 있습니다.

+0

감사합니다. 나는 절대적인 대답이 없다는 것을 받아 들여야한다고 생각한다. – user3771755