SQL Server가 충돌하는 SQL 쿼리를 추적하는 방법


9

우리는 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 데이터베이스 임) 문제가있는 쿼리를 찾기 위해 어떻게 필터링합니까?

감사!


1
모든 것이 동일한 서버에서 실행됩니까? 즉, Java를 포함한 응용 프로그램 서버가 데이터베이스 서버에서도 실행되고 있습니까?
swasheck

1
@swasheck의 질문과 관련하여 SQL Server 최대 메모리에 명시적인 값이 설정되어 있습니까? 외부 메모리 부족을 배제 했습니까?
Mike Fal

블랙 박스 흔적을 보려고 했습니까? 그들은 올바른 방향으로 당신을 가리킬 수 있습니다.
datagod

방금이 문제를 겪었고 응용 프로그램 관점에서 유휴 데이터베이스를 표시하면서 실행 한 흔적이 있습니다.
Joshua

전체 텍스트 검색을 사용합니까? 또한 실행중인 SQL Server의 정확한 빌드 + + 버전은 무엇입니까?
Kin Shah

답변:


5

명령을 사용하여 SQL Server의 메모리 사용량을 모니터링 하는 방법DBCC MEMORYSTATUS 의 단계 개요를 따르십시오 . 치료 조치는 결과에 따라 다릅니다. 보다 접근하기 쉬운 Microsoft SQL Server 메모리 병목 현상을 식별하는 방법을 읽을 수도 있습니다.

그러나 한 가지주의 할 점은 개별 쿼리를 비난 할 가능성이 거의 없다는 것입니다. 메모리 문제 추적은 그보다 미묘합니다. 리소스가 부족하고 쿼리에 메모리 부족 오류가 발생하면 오류를 발생시키는 쿼리가 범인 이 아니라 피해자 일 수 있습니다.


고마워-이미 살펴 봤지만 문제는 서버가 제대로 작동하는 것처럼 보이고 갑자기 쾅쾅 뛰는 것입니다. 점차적으로 메모리가 부족하지 않습니다. 또한 "이 쿼리를 실행하기 위해 '내부'리소스 풀에 시스템 메모리가 부족합니다"라는 오류가 온라인에서 무엇인지 찾을 수 없습니다. 실제로 의미-DBCC MEMORYSTATUS의 결과와 관련하여 내부 자원 풀이 란 무엇입니까?

이것이 개발 서버입니까? 그렇다면 Hibernate 3.1로 다운 그레이드하여 문제가 사라 졌는지 확인할 수 있습니까? 두 개의 초기 조회 행이 있으며 그 중 하나를 제거하려고 시도해야합니다. SQL Server에 메모리 제한이 설정되어 있으며이를 초과하거나 시스템의 다른 부분에서 메모리를 소비하고 있고 SQL Server가 압착되고 있습니다. 충돌 발생 시간에 시스템을 프로파일 링하여 어떤 상황이 발생하는지 확인하십시오.
epo

0

Extended Events이벤트를 사용하여 구성 하려고 합니다 query_memory_grant_xxxxx.

이것은 정보를 기록하고 언제든지 읽을 수있는 저장된 SQL 엔진 크기 (실시간 데이터도 볼 수 있음)를 저장하는 가장 좋은 옵션입니다. 서버가 다시 시작될 때 저장된 정보가 지워지지 않습니다. DMVs

빠른 설정 단계 ..

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.