안녕하세요.

얼마 전에 SQL 버전을 2012 Standard에서 2016 Standard로 업그레이드하면서 DB 이관을 했습니다.


그런데 이관 후에 쿼리 플랜이 재컴파일이 되는 이슈가 발생하고 있습니다.

즉, 쿼리 플랜이 적재되지 않고 계속 갱신됩니다. (Plan Cache 생성됐다가 바로 삭제됨)


sys.dm_exec_query_stats, sys.dm_exec_cached_plans 테이블의 count(*)를 연속으로 확인하면 5, 1, 10, 0, 2 이렇게 값이 계속 바뀌고,

해당 테이블의 쿼리 플랜 데이터도 유지되지 않고 계속 변경되는 것을 확인했습니다. 

(이관 전에는 수천개의 유지되는 쿼리 플랜 데이터가 있었습니다.)


SQL 버전을 업그레이드 했다고 이러한 현상이 발생하지는 않을것 같습니다.

DB 서버의 내용은 아래와 같습니다. (이중에 원인이 될 만한 내용이 있을까 하여 남깁니다.)


- DB 백업/복원 방식 : 풀백업(norecovery 복원) -> 차등백업(norecovery 복원) -> 로그백업(recovery 복원)

- OS : Windows Server 2016 Standard

- DB : MSSQL 2016 Standard

- Lock Pages In Memory 설정

- Min/Max Server Memory : 124,000

* 물리 메모리는 128GB이고, 메모리 설정한 만큼 sql service가 메모리를 점유하고 있음.

- 추척플래그 ON : T845, T1118, T1204, T1222

- 매일 새벽 통계 업데이트 실행 (유지 관리 계획)

- DB 호환성 수준 : SQL Server 2012(110)

* SQL Server 호환성에 따라서 쿼리 플랜이 다르기에 바로 호환성을 높혀서 사용하면 쿼리 플랜이 변경될 수 있음.

* 복원 직후 호환성 수준을 SQL Server 2016(130)으로 변경했다가 위 내용을 접하고 다시 SQL Server 2012(110)로 설정한 상태임.

- 주로 Stored Procedure를 사용하고, 극히 일부에서만 리컴파일 옵션 사용함.


프로파일러에서 SP:Recompile을 찾아봤는데 의심할 만한 결과는 나오지 않았습니다.

그리고 SQL 로그에도 관련 내용은 없습니다.


업그레이드 전에는 지속적으로 DMV를 통해 쿼리 성능을 확인했는데, 현재는 쿼리 플랜이 남지 않아서 할 수가 없네요.

또한 CPU 사용률도 전 서버보다 높아졌는데, 재컴파일로 인한 것이 아닐까 생각하고 있습니다.


어떠한 부분을 확인해 봐야 할까요? 도움 부탁 드립니다.