SQL Server의 실행계획의 연산자 가운데 SORT나 HASH와 같은 메모리 소비 연산자(memory cosuming operator)라는 것이 있는데

이 연산자를 처리하기 위해서는 SQL Server Query Processor는 사용 가능한 메모리를 검색한 뒤  필요한 메모리를 확보하고 실행단계에 들어가는데

이 때 해당 작업을 위해서 필요한 메모리를 할당받기 위해 대기할 수도 있고 쿼리 수행과정에서  sort warning이나 hash warning 이벤트를 발생시키곤 한다. 

 

 

이러한 이벤트들은 성능저하의 원인이 되는데

 

sort warning의 경우는 정렬 작업 시 메모리 부족으로 정렬작업을 한번에 완료하지 못하고 여러번 작업을 나누어 수행하는 경우에 발생하며

hash warning의 경우 build input을 생성 시 메모리가 부족하여 한번에 로딩하지 못하고 여러번에 나누어서 처리하는 recursive hashing을 하다가 발생하게 된다.

 

이것은 최초 실행계획을 생성할 당시 필요하다고 판단한 메모리의 양 보다  쿼리를 수행할 당시 필요로 하는 메모리의 양이 많은 경우로

통계 정보가 최신화 되어 있지 않은 경우가 주요 원인이 된다.


결국 통계정보에서 얻은 cardinality 정보를 기준으로 계산한 필요 메모리 크기가 실제 데이터를 로딩하면서 필요로 하는 메모리의 양보다 적기 때문으로

 통계정보의 최신화의 중요성을 다시 한번 생각하게 한다.

 

해결책이라고 한다면 이와 같은 이벤트가 확인되면 먼저, 통계정보의 최신성을 확인하고,  sort warning의 경우 SORT연산자를 사용하지 않도록 인덱스를

사용하여 검색할 수 있도록 힌트 등을 사용해서  유도하든지,  적절한 인덱스를 추가하는 것도 고려해볼 필요가 있겠다.

또한 SELECT 절에 불필요한 컬럼이 포함되지는 않았는지도 검토 해볼것을 권장해 본다.

 

한마디 덧 붙이자면 실행계획을 작성할때 필요로하는 메모리의 양을 불필요하게 많이 할당 받는 것도  성능상  비효율을 초래하므로

비용기반 옵티마이저 환경에서는 가장 기본은 통계정보의 최신화를 적절히 관리하는 것이라 하겠다.

+ Recent posts