Rebinds와 Rewinds
그래픽 실행 계획의 기초를 진행해 오던 동안 다음과 같은 물리 연산자를 몇 번 보았을 것이다.
-
Actual Rebinds 또는 Estimated Rebinds
-
Actual Rewinds 또는 Estimated Rewinds
혹시 어디에서 보았는지 기억나는가?
대부분의 경우 rebinds와 rewinds의 이 두 값은0이었다. 하지만 11.그래픽 실행 계획의 기초 – GROUP BY와 ORDER BY가 있는 쿼리에서의 실행 계획 의 [그림 2] Sort의 ToolTip을 다시 살펴보면 Actual Rebinds는 1이고 Actual Rewinds는 0이라는 것을 확인할 수 있을 것이다.
이 값의 의미를 이해하기 위해서는 물리 연산자에 대한 약간의 배경 지식이 필요하다. 실행 계획 내에서 Sort 연산자와 같은 물리 연산이 발생할 때마다 다음과 같은 일들이 일어난다.
-
첫째, 물리 연산자가 초기화되고 필요로 하는 데이터 구조가 생성된다. 이를 Init() 메소드라고 한다. 이 메소드는 여러 번 호출하는 것이 가능하긴 하지만 연산자당 오직 한 번만 호출된다.
-
둘째, 물리 연산자가 데이터 행을 취득한다. 이를 GetNext() 메소드라고 한다. 이 메소드는 연산자 타입에 의존하며, 한 번도 호출되지 않을 수도 있고, 혹은 여러 번 호출될 수도 있다.
-
셋째, 연산자의 처리가 끝나면 생성된 데이터 구조를 말끔히 비우고 종료시켜야 한다. 이를 Close() 메소드라고 하며, 연산자당 오직 한 번만 호출된다.
Rebind 또는 Rewind는 연산자에 의해 Init() 메소드가 호출된 회수를 의미한다. Rebind와 Rewind 모두 Init() 메소드가 호출될 때 카운트를 하지만 호출 시기는 조금 다르다. Rebind count는 Join과 관련된 파라미터가 하나 이상 바뀌어 내측 집합(Inner set혹은 내측 루프)이 재평가 될 때 발생하며, Rewind count는 파라미터는 바뀌지 않았으나 이전의 내측 집합이 재사용될 때 발생한다.
지금까지의 내용을 종합해 볼 때, 모든 물리 연산자의 Rebind와 Rewind 값은 ToolTip이나 속성 창에서 반드시 1 이상의 값으로 채워져 보일 것으로 예상할 수 있을 것이다. 하지만 실제로는 그렇지 않다. 이상하게도 아래와 같은 특정 물리 연산자에서만 Rebind와 Rewind 값이 채워진다.
-
Non-clustered Index Spool
-
Remote Query
-
Row Count Spool
-
Sort
-
Table Spool
-
Table-Valued Function
그리고 다음의 물리 연산자들은 해당 물리 연산자의 StartupExpression이 True로 설정되는 경우에만 그 값이 채워지는데, 이는 쿼리 옵티마이저가 쿼리를 어떻게 평가하느냐에 달라진다. 이것은 마이크로소프트가 코드로 설정한 것으로 여러분이 제어할 수 없다.
-
Assert
-
Filter
이 밖의 물리 연산자에서는 Rebind와 Rewind 값이 채워지지 않는다. 이 경우, Rebind와 Rewind는 0으로 표시된다. 0라고 해서 Rebind와 Rewind가 한 번도 발생하지 않았다고 의미하는 것은 아니다. 단지 그 값이 채워지지 않았음을 의미한다.
그렇다면, 위의 8개 연산자들에서 Rebind와 Rewind 에 채워진 값은 무엇을 의미하는가?
이쯤에서 11.그래픽 실행 계획의 기초 – GROUP BY와 ORDER BY가 있는 쿼리에서의 실행 계획 의 [그림 2] Sort의 ToolTip을 다시 한 번 보도록 하자. 이 연산자에서 Rebind는 1, Rewind는 0이다. 즉, 물리 연산자에 의해 Init() 메소드가 한 번 호출되었으며, 이 연산자는 루프 조인의 내측 집합에 위치하고 있지 않다는 것을 의미한다. 만일 물리 연산자가 루프 조인의 내측 집합에 위치하게 되면, Rebind와 Rewind의 합계는 연산자에 의해 사용된 외측 집합의 행 수와 같게 된다.
그렇다면 이 값을 어떻게 이용해야 할까? Rebind와 Rewind 는 그 값이 작을수록 좋다. 이 값이 커질수록 디스크 I/O가 보다 많이 발생하고 있음을 의미한다. 이 값이 크다는 것은 특정 연산자가 필요 이상으로 힘들게 일하고 있음을 의미하므로 성능에 나쁜 영향을 준다. 이 경우 쿼리 재작성(Query Rewrite)이나 쿼리가 사용 중이었던 인덱스가 수정되었을 가능성을 의심해 보아야 한다.
'연구개발 > 실행계획' 카테고리의 다른 글
14. 텍스트 및 XML 실행 계획의 기초 - 텍스트 실행 계획 (0) | 2011.07.18 |
---|---|
13. 그래픽 실행 계획의 기초 - Insert, Update, Delete문의 실행 계획 (0) | 2011.07.17 |
11. 그래픽 실행 계획의 기초 - GROUP BY와 ORDER BY가 있는 쿼리에서의 실행 계획 (0) | 2011.07.17 |
10. 그래픽 실행 계획의 기초 - WHERE절의 추가 (0) | 2011.07.17 |
9. 그래픽 실행 계획의 기초 - Table Joins (0) | 2011.07.17 |