반응형

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)이나 쿼리가 사용 중이었던 인덱스가 수정되었을 가능성을 의심해 보아야 한다.

 

 

 

다음이야기 : 13. 그래픽 실행 계획의 기초 - Insert, Update, Delete문의 실행 계획

반응형

+ Recent posts