우리는 SQL Server 2008 데이터베이스 서버를 가지고 있습니다 (MS 장애 조치 클러스터링에서 실행되고 있지만 여기서는 관련이 없다고 생각합니다).
우리의 응용 프로그램은 DB 액세스를 위해 Hibernate를 실행하고, 최근 v3.1에서 3.6으로 업그레이드 한 이후, 정기적으로 (24 ~ 48 시간, 때로는 더 자주) SQL Server 충돌이 발생했습니다.
문제의 특정 문제는 메모리와 관련된 것으로 보입니다. 서버가 충돌하기 직전에 (그리고 장애 조치 클러스터 관리자가 자동으로 다시 시작한 경우) 다음과 같은 오류가 발생합니다.
Error: 701, Severity: 17, State: 130.
There is insufficient system memory in resource pool 'internal' to run this query.
가끔 (그러나 규칙적인) 메시지
Error: 17300, Severity: 16, State: 1. (Params:). The error is printed in terse mode because there was error during formatting. Tracing, ETW, notifications etc are skipped.
오류 : 17312, 심각도 : 16, 상태 : 1. (파라미터 :). 포맷하는 동안 오류가 발생하여 오류가 간결 모드로 인쇄됩니다. 추적, ETW, 알림 등을 건너 뜁니다.
또한 다음과 같은 앱 수준 오류가 발생합니다.
java.sql.SQLException: A time out occurred while waiting to optimize the query. Rerun the query.
흥미롭고 유익한 오류 :
The query processor ran out of internal resources and could not produce a query plan.
This is a rare event and only expected for extremely complex queries or queries that reference a very large number of tables or partitions.
Please simplify the query. If you believe you have received this message in error, contact Customer Support Services for more information.
서버의로드는 변경되지 않았으므로 이전에 쿼리 전송에 문제가 있음을 나타내지 않았을 때 메모리가 부족할 이유가 없습니다.
이제 질문에-이 오류를 일으키는 쿼리 (및 아마도 모든 문제)를 어떻게 추적합니까? 우리의 최대 절전 모드 업그레이드 이후 SQL Server에서 거대한 쿼리를 시작한 것 같습니다. 그것이 일어날 때, 나는 그들이 무엇인지에 대한 몇 가지 아이디어를 가지고 있지만, 그것들을 추적하는 것이 좋을 것입니다.
물론 SQL Server 프로파일 러를 실행할 수는 있지만 일단이 작업이 완료되면 (대량의 데이터가 생성됩니다. 사용량이 많은 OLTP 데이터베이스 임) 문제가있는 쿼리를 찾기 위해 어떻게 필터링합니까?
감사!