실행 계획과 STATISTICS IO 순서


20

SQL Server 그래픽 실행 계획은 오른쪽에서 왼쪽으로, 위에서 아래로 읽습니다. 에 의해 생성 된 출력에 의미있는 순서가 SET STATISTICS IO ON있습니까?

다음 쿼리 :

SET STATISTICS IO ON;

SELECT  *
FROM    Sales.SalesOrderHeader AS soh
        JOIN Sales.SalesOrderDetail AS sod ON soh.SalesOrderID = sod.SalesOrderID
        JOIN Production.Product AS p ON sod.ProductID = p.ProductID;

이 계획을 생성합니다.

그래픽 실행 계획

그리고이 STATISTICS IO출력 :

Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'SalesOrderDetail'. Scan count 1, logical reads 1246, physical reads 3, read-ahead reads 1277, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'SalesOrderHeader'. Scan count 1, logical reads 689, physical reads 1, read-ahead reads 685, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Product'. Scan count 1, logical reads 15, physical reads 1, read-ahead reads 14, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

그래서 나는 반복한다 : 무엇을 주는가? STATISTICS IO출력 순서가 의미 가 있거나 임의의 순서가 사용됩니까?

답변:


9

다양한 쿼리로 처음 놀았을 때 전혀 패턴이 없었지만 더주의를 기울이면 일련 계획에 대해 예측 가능한 것으로 보입니다. 나는에 결국 KB314648 @AustinZellner 언급되는 :

각 SQL Server 연결에는 연결 별 상태 정보를 유지 관리하는 관련 프로세스 상태 구조 (PSS)가 있습니다. sysprocesses 시스템 테이블의 각 고유 SPID (서버 프로세스 ID)는 다른 PSS를 나타내며 sysprocesses 가상 테이블의 정보는이 상태 정보에 대한 "보기"입니다.

그리고 귀하의 질문과 관련된 섹션 :

연결에 대해 STATISTICS IO가 활성화 된 경우 SQL Server는 쿼리 실행 중에 배열을 할당하여 테이블별로 IO 정보를 추적합니다. SQL Server는 쿼리를 처리 할 때 해당 논리적 IO 요청이 물리적 IO를 발생했는지 여부와 함께이 배열의 해당 테이블 항목에 페이지에 대한 각 논리적 요청을 기록합니다. SQL Server는 쿼리 끝에 오류 메시지 3615로 정보를 반환합니다.

관찰 된 동작은 IO가 생성 된 순서대로 배열에 항목이 작성됨을 나타냅니다. 기본적으로 실제 연산자의 GetNext () 결과입니다. 통계 출력의 마지막 항목은 IO가 기록 된 첫 번째 테이블이고 첫 번째 항목은 마지막 테이블입니다. 어떤 병렬 작업이 먼저 예약되는지에 대한 보장이 없으므로 병렬 계획의 순서는 예측할 수 없다고 추측합니다.


5

계획에서 데이터 읽기 액세스의 반대 순서 인 것처럼 보입니다. 계획은 먼저 제품 테이블에서 읽어 해시 테이블 (작업 테이블)을 작성합니다. SalesOrderHeader에서 읽은 후 병합 조인 연산자와 결합하여 SalesOrderDetail을 형성합니다. 그런 다음 작업 테이블을 마지막부터 읽어 원래 제품 행과 병합 조인의 행을 해시 일치시킵니다. 이것이 통계 출력에 나열된 순서와 정확히 반대입니다.

그러나 이것을 지정하는 문서는 알지 못합니다. 어떤 순서로 테이블 액세스가 발생했는지 확인하려면 실행 계획을 읽으십시오.


이 경우 반대 순서로 진행되며 다른 경우에는 다릅니다. 나는 대중이 일반적으로 이용할 수없는 엔진에 대한 친밀한 지식 없이는 발견 할 수있는 명령이 없다고 생각한다.
예레미야 Peschka

다른 순서의 예가 있습니까?
Sebastian Meine

SELECT * FROM Sales.SalesOrderHeader AS soh JOIN Sales.SalesOrderDetail AS sod ON soh.SalesOrderID = sod.SalesOrderID LEFT JOIN Sales.SalesPerson AS sp ON soh.SalesPersonID = sp.BusinessEntityID LEFT JOIN Person.Person AS p2 ON sp.BusinessEntityID = p2. .BusinessEntityID JOIN Production.Product AS p ON sod.ProductID = p.ProductID;
예레미야 페 슈카

병렬 처리가 포함되지 않는 한 내 관찰은 사실입니다. 일련 계획을 보려면 TOP (100), TOP (1000) 및 TOP (10000)으로 쿼리를 실행할 수 있습니다. 그러나 TOP (100000) 또는 TOP이 없으면 두 가지 병렬 계획이 적용되며 모든 베팅이 해제 된 것으로 보입니다.
Sebastian Meine

3

나는 행정보다 프로그래밍을 더 많이 할 때부터 질서가 있다고 생각했다. 나는 몇 가지 실행 계획을 겪고 내 믿음을 두 번 확인했습니다.

다음은 내가 보는 것입니다.

여러 단계의 쿼리 (예 : 많은 저장 프로 시저)에서 순서는 쿼리가 실행되는 물리적 순서를 반영합니다.

특정 쿼리의 경우 통계 IO는 오른쪽에서 시작하여 왼쪽으로 작업하는 통계를보고하여 실행 계획을 반영하는 것처럼 보입니다.

아마도 이것은 다른 것보다 더 많은 관찰 일 것입니다.


2
이것에 뭔가가있을 수 있습니다. 테이블의 순서를 반대로 바꾸면 출력 SELECT COUNT(*) FROM HumanResources.EmployeeDepartmentHistory UNION ALL SELECT COUNT(*) FROM HumanResources.Employee UNION ALL SELECT COUNT(*) FROM HumanResources.Department도 반전 IO되지만 문제의 예에서 작업 테이블이 먼저보고되는 이유는 설명하지 않습니다.
Martin Smith

@MartinSmith 예, 작업 테이블은 제 제한된 관점에서 와일드 카드입니다.
RLF

0

따라서 통계 결과는 런타임에 실제로 발생하는 상황에 대해 훨씬 더 많은 통찰력을 제공한다고 생각합니다. 캐시 대신 디스크에서 읽을 필요가 있고 계정의 권한에 의해 영향을 받기 때문입니다. 쿼리가 실행되고 있습니다. 통계 리턴에서 테이블의 위치는 프로파일 러가 고려한 것 이외의 다른 요인에 의해 영향을받습니다.

다음은 통찰력과 몇 가지 예를 제공하는 KB 문서입니다. http://support.microsoft.com/kb/314648


1
문제는 STATISTICS IO일반적인 결과에 관한 것이 아닙니다 . 순전히 다양한 테이블의 읽기가보고되는 순서에 관한 것입니다. 나는 당신의 링크에서 이것에 대해 아무것도 보지 못했습니다.
Martin Smith
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.