반응형

저장 프로시저에서의 실행 계획

저장 프로시저에서의 실행 계획은 지금까지 살펴본 예문에서의 실행 계획과 별반 다를 바 없다.

이해를 돕기 위해 AdventureWorks 데이터베이스에 아래와 같이 저장 프로시저를 작성해 보자.

CREATE PROCEDURE [Sales].[spTaxRateByState]
    @CountryRegionCode NVARCHAR(3)
AS
    SET NOCOUNT ON ;
 
    SELECT [st].[SalesTaxRateID],
           [st].[Name],
           [st].[TaxRate],
           [st].[TaxType],
           [sp].[Name] AS StateName
      FROM [Sales].[SalesTaxRate] st
      JOIN [Person].[StateProvince] sp
        ON [st].[StateProvinceID] = [sp].[StateProvinceID]
     WHERE [sp].[CountryRegionCode] = @CountryRegionCode
     ORDER BY [StateName]
GO

 

그리고 아래와 같이 저장 프로시저를 실행 해보자.

EXEC [Sales].[spTaxRateByState] @CountryRegionCode = 'US'

 

실질 실행 계획의 결과는 아마 다음과 같이 보여질 것이다.


 

[그림 1] 저장 프로시저 [Sales].[spTaxRateByState] 를 실행하였을 때의 실질 실행 계획

 

먼저, @CountryRegionCode 파라미터에 바인드된 값(‘US’)을 토대로 Person.StateProvince 테이블을 Clustered Index Scan 연산을 한다. 그리고 이 연산을 통해 얻어진 결과는 Sort 연산자에 의해 정렬된다. 정렬된 데이터는 Sales.SalesTaxRate 테이블에서  Index Seek 연산을 통해 얻어진 결과와 Nested Loop Join을 한다.

 

다음으로 Key Lookup 연산을 수행한다. 이 연산자는 Sales.SalesTaxRate 테이블에 대해 AK_CountryRegion_Name 인덱스를 Index Seek 연산한 결과인 키 리스트를 공급 받아, 공급 받은 키 값을 토대로 Clustered Index 상에 데이터를 검색한다.

 

마지막으로 앞에서 Nested Loop 연산을 한 결과와 다시 Nested Loop 연산을 수행한다.

 

선두에서 이미 언급하였다시피 저장 프로시저라고 해서 실행 계획이 특별한 것은 아니다.  우리가 관심을 가져야 할 부분은 실행 계획 자체가 아니라, 저장 프로시저 안의 T-SQL구문 역시 일반 T-SQL문과 똑같이 실행 계획이 풀린다는 점이다. 

반응형

+ Recent posts