쿼리가 tempdb에 유출을 일으키는 이유는 무엇입니까?


27

배경

48GB RAM이있는 Win 2008 서버의 MSSQL 2008 (표준)에서 160gb 데이터베이스를 64GB RAM이있는 Win 2012의 MSSQL 2012 (64 비트 웹 버전)를 실행하는 새 서버로 마이그레이션하는 중입니다. 이전 서버는 활성 상태이며로드 상태입니다. 새 서버가 프로덕션 상태가 아닙니다. 새 서버에는 8 개의 tempdb 파일 (각 4GB)이 있습니다.

문제

새 서버에서 테스트 할 때 수많은 쿼리의 단계에서 "운영자가 tempdb를 사용하여 데이터를 유출하는 데 사용했습니다"라는 경고가 표시됩니다. 일부 쿼리를 다시 작성하여 정렬을 피할 수 있었지만 실제로 문제를 해결하지는 않습니다. 이전 서버의 동일한 쿼리로 인해 유출이 발생하지 않습니다. MSSQL이 메모리에서 작업을 완료 할 수없고 tempdb로 넘치거나 페이지를 넘겨야 할 때 유출이 발생한다는 것을 읽었습니다. 유출에 대해 걱정해야합니까?

여기에 이미지 설명을 입력하십시오

데이터베이스에서 sp_updatestats를 실행 했으므로 통계가 최신 상태 여야하지만 예상 행 수와 실제 행 수 사이에 약간의 차이가 있습니다.

기억력 문제

64GB 중 58의 MSSQL에 대한 최대 메모리 설정을 설정했습니다. 현재 MSSQL은이 메모리의 약 35GB를 소비했지만 682mb의 작업 세트 만 있습니다. 이전 서버 (프로덕션, 처리 부하에도 불구하고)에는 44GB의 메모리가 MSSQL에 커밋되어 있으며 그 중 43.5gb가 작업 세트에 있습니다.

여기에 이미지 설명을 입력하십시오

유출이 메모리 설정과 관련이 있는지 모르겠습니다. 아무도 아이디어가 있습니까? MSSQL은 현재 여분의 RAM을 가지고 있으므로 왜 어떤 종류와 해시 일치를 위해 tempdb에 유출됩니까?


7
실행 계획의 경고는 2012 년에 새로 추가되었습니다. 이전 서버에서 쏟아지지 않았는지 확인 했습니까? 이것을 감시하고 있었습니까?
Martin Smith

@MartinSmith 아, 경고가 새로운 것을 깨닫지 못했습니다. 이전 서버에서 유출을 모니터링하지 않았습니다. 조사하겠습니다.

1
약간 접하는 점이지만 기본적으로 tempdb 레벨 0 유출 및 런타임 25를 유발하는 매우 우수한 행 추정과 함께 병합 조인을 사용하는 10 테이블 조인 앞에 앉아 있습니다. 해시 조인 (및 순서)을 강제하면 유출을 제거하고 9 초 안에 실행됩니다. 병합 대 해시 또는 유출이 차이를 일으키는 지 여부와 옵티마이 저가 곧 알려진 유출의 영향에 올바르게 가중치를 부여하는지 궁금합니다 (행 추정이 매우 우수하기 때문에).
crokusek

새 서버에 하드웨어 numa가 있습니까?
stacylaray 2014 년

답변:


28

여기에 몇 가지 다른 질문이 있습니다.

Q : 이전에 쿼리가 유출되지 않은 이유는 무엇입니까?

그러나 SQL Server Management Studio는이를 SQL 2012 이전의 명확한 오류로 표시하지 않았습니다. 성능 조정을 수행 할 때 그래픽 실행 계획보다 더 깊이 들어가야하는 좋은 예입니다.

Q : 쿼리가 디스크로 유출되는 이유는 무엇입니까?

SQL Server가 작업을 완료하기에 충분한 메모리를 부여하지 않았기 때문입니다. 아마도 실행 계획은 필요한 메모리 양을 과소 평가했거나 상자에 메모리 부족이 있거나 아마도 큰 쿼리 일 것입니다. SQL Server는 원시 데이터 페이지 캐싱, 실행 계획 캐싱 및 쿼리 작업 영역의 세 가지 작업에 메모리를 사용합니다. 작업 영역 메모리는 상당히 작습니다.

Q : 유출을 줄이려면 어떻게해야합니까?

Sargable T-SQL 문을 작성하고, 최신 통계를 보유하고, 서버에 충분한 메모리를 배치하고, 올바른 인덱스를 작성하고, 예상대로 작동하지 않을 때 실행 계획을 해석합니다. 확인 그랜트 Fritchey의 책 SQL Server 쿼리 성능 튜닝을 모든 이들의 상세한 설명은.

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