Tip & Tech

Sql server 2005 버전부터 소개된 apply 는 join 쿼리와 유사하지만 테이블 형식 리턴 함수나 corelated subquery 를 테이블 대신 사용할수 있다. 또한 왼쪽 테이블의 값을 테이블 리턴 함수나 corelated subquery 의 인자로 사용할 수 있어서 왼쪽 테이블 값에 따라 데이터를 처리하여 나온 결과값을 왼쪽 테이블 데이터와의 결합에 사용할 수 있다. 하나의 필드값 만이 필요할 때는 Scala 함수를 이용하여 select 리스트에 함수를 호출하면 되지만 입력 변수에 따라 여러 필드를 동시에 가져와야할 경우 나 내부 함수처리를 통해 데이터를 만들어야 할 경우 apply가 매우 유용한 구문이 될 수 있다.

Apply 실행시 오른쪽 테이블 리턴함수 또는 서브쿼리는 각 레코드에 대해서 각각 평가된다.


Apply 에는 cross apply 와 outer apply 가 있는데

cross apply 는 테이블 리턴함수 또는 corelated subquery를 사용할수 있다는것을 제외하고 inner join 과 같은 결과를 가져온다.

Outer apply 는 테이블 리턴함수 또는 corelated subquery를 사용할 수 있다는 것을 제외하고 left outer join 과 같은결과를 가져온다. 따라서 outer apply 는 오른쪽 테이블 리턴함수 또는 corelated subquery에서 리턴되는 데이터가 없더라도 결과 값을 반환하지만 오른쪽 테이블 리턴함수 또는 corelated subquery의 칼럼들은 null 을 반환한다.


일반적인 join 을 이용하여 쿼리할수 있는데 굳이 apply 를 사용해야 하는 의문이 들수 있다. 하지만 테이블 반환함수를 오른쪽 테이블 반환함수나 서브쿼리에 왼쪽 테이블의 값을 인자로 제공할 수 있다는 특징이 있다. 이것은 join 쿼리로 구현할 수 없는 기능이다.

또한 성능점검을 위한 Dynamic Management Function (DMF) 사용시에도 apply 는 매우 유용한 구문이 된다.


Apply 에는 join 에서와 같은 on 절을 사용하지 않는다. 오른쪽 테이블 반환 함수나 corelated subquery 에 리턴되는 결과값이 있으면 해당 결과값의 레코드 수만큼 결과집합은 수가 늘어나게 된다.


왼쪽 테이블에도 테이블 리턴 함수를 사용할 수 있지만 오른쪽 테이블의 레코드 값을 인자로 사용할 수는 없다.



 
USE master 

GO 

SELECT DB_NAME(r.database_id) database, st.[text] query

FROM sys.dm_exec_requests r 

CROSS APPLY sys.dm_exec_sql_text(r.plan_handle) st 

WHERE r.session_Id > 50 -- 시스템 spid 를 배제하기 위해 

AND r.session_Id NOT IN (@@SPID) -- 현재 spid 를 배제하기 위해