MS SQL Server에서 처녀 쿼리의 성능을 향상시키는 방법은 무엇입니까?


10

ASP.NET 웹 사이트에 자체 데이터 캐싱을 수행하고 데이터가 장기간 변경되지 않으므로 동일한 쿼리로 SQL Server를 두 번 쿼리 할 필요가 없습니다. 해당 SQL Server로 이동하는 최초 (처음) 쿼리의 성능을 향상시켜야합니다. 일부 쿼리는 너무 많은 데이터를 처리하여 SQL Server를 사용할 수 있습니다 tempdb. 임시 테이블 변수 또는 임시 테이블을 사용하지 않으므로 SQL Server는 tempdb필요할 때마다 자체적 으로 사용하기로 결정 합니다.

내 DB 크기는 16Gb이고 서버 시스템에서 32Gb의 실제 RAM을 사용할 수 있습니다.

MS SQL Server 캐싱 전략은 동일한 데이터를 다시로드해야하는 경우 유사한 쿼리의 성능을 높이기 위해 RAM에 데이터를 유지하려고합니다. 또한 tempdb 대신 사용 가능한 RAM을 사용하여 디스크 액세스없이 성능을 향상 시키려고합니다.

tempdb SQL Server에 무언가를 저장 해야하는 쿼리가 나오고 사용 가능한 RAM이 충분하지 않으면 SQL Server에 두 가지 선택이 있다고 가정합니다.

1) 캐시 된 데이터를 언로드하고 tempdb 대신 여분의 RAM을 사용하여 디스크 쓰기 방지

2) 향후 쿼리를 위해 캐시 된 데이터를 유지하고 tempdb를 사용하기 시작하면 디스크 쓰기 속도가 느려집니다.

이 상황에서 SQL Server가 어떤 선택을할지 모르겠지만 첫 번째 (처음) 쿼리의 성능에만 관심이 있기 때문에 # 1을 선택하고 싶습니다. 같은 쿼리를 SQL Server에 다시 보내지 않기 때문입니다. (유사한 쿼리를 보낼 수도 있지만).

이 시나리오에 대한 SQL Server 캐싱 전략은 무엇입니까?

버진 쿼리에 대한 tempdb 방지와 두 번째 쿼리 속도 사이에서 RAM 사용의 균형을 어떻게 조정합니까?

선택 # 1을하는 방식으로 SQL Server를 구성 할 수 있습니까? 그렇다면 어떻게?

다른 모든 SQL 쿼리의 성능을 향상시킬 수있는 방법은 무엇입니까?

SQL Server 캐싱 전략에 대해 잘 모르기 때문에 RAM 디스크에 데이터베이스를 배치하고 싶습니다. 이렇게하면 SQL Server가 항상 # 1을 선택하더라도 모든 처녀 쿼리에 캐시되지 않은 데이터를 빠르게로드 할 수 있습니다. 그것의 위험은 SQL Server가 2 번 선택을 계속하면 사용 가능한 RAM이 적을 때 더 많은 tempdb를 사용하기 시작할 수 있다는 것입니다 (RAM 디스크에 16Gb를 사용한 후에 16Gb 만 남음) tempdb.

SQL 2008 R2 솔루션에 관심이 있지만 SQL 2008, SQL 2005와 동일하고 SQL 2000 일 수 있습니다.

설명 :

해당 상자에서 실행되는 다른 응용 프로그램은 없으며 SQL Server 전용 입니다. 웹 사이트는 별도의 상자에서 실행됩니다.

Windows Server 2008 R2 Enterprise 64 비트의 SQL Server 2008 R2 Standard Edition 64 비트입니다.

읽기 전용 쿼리 만 실행하고 데이터베이스는 읽기 전용으로 설정되어 있습니다 .

이미 좋은 인덱스가 있다고 가정 해 봅시다 . 이 질문은 SQL Server가 선택 # 1과 선택 # 2를 선택하는 방법, 제어 방법이 있고 RAM 디스크가 처녀 쿼리에 적합한 선택을하는 데 도움이되는 경우 어떻게 하는가에 관한 것입니다.


temp 테이블을 만들지 않아도 tempdb가 사용되고 있다고 생각하는 이유는 무엇입니까? 구별 또는 그룹 별 테이블을 사용하고 있습니까?
darin 해협

3
32/64 비트? 물리적 또는 가상? 이 서버는 SQL Server 전용입니까, 아니면 같은 상자에서 IIS 또는 다른 앱을 실행하고 있습니까? 쿼리 실행 계획에 대한 분석을 수행 했습니까? 예제 쿼리 및 / 또는 실행 계획을 게시 할 수 있습니까? 그리고 운이 좋을 것입니다 ... Kendra의 가이드를 따라 문제 쿼리가 실행되는 동안 sp_whoisactive를 로깅 하고 출력을 게시하십시오.
Mark Storey-Smith

@darinstrait 대부분의 설명은 일종의 해시 유출 일 것입니다.
Mark Storey-Smith

답변:


7

귀하의 질문은 기본적으로 '쿼리 메모리 부여는 어떻게 작동합니까?'로 표현 될 수 있습니다. 주제에 대해 잘 읽어 보면 SQL 서버 메모리 부여 이해 가 있습니다. 쿼리가 실행되기 전에 정렬 및 해시 및 기타 메모리 배고픈 작업에 대한 메모리 부여 필요할 수 있습니다 . 이 메모리 부여는 추정치 입니다. 현재 시스템 상태 (실행 및 보류중인 요청 수, 사용 가능한 메모리 등)에 따라 시스템은 쿼리에 필요한 양만큼 메모리 부여를 부여 합니다 . 메모리가 부여되면 쿼리가 실행을 시작합니다 (허가를 받기 전에 두려운 '자원 세마포'큐에서 대기해야 할 수도 있습니다). 실행시 메모리 부여가 보장됩니다.시스템에 의해. 이 메모리 양은 데이터 페이지와 공유 할 수 있지만 (언제나 디스크로 플러시 할 수 있기 때문에) 다른 메모리 사용과는 절대로 맞지 않습니다 (예 : '훔칠'수 없습니다). 따라서 쿼리에서 승인 된 메모리에 대한 커밋 된 메모리를 요청하기 시작하면 엔진은 사용자가 '전략 # 1'이라고 부르는 것을 배포합니다. 데이터 에 약속 된 메모리를 제공하기 위해 데이터 페이지 가 제거 있습니다 (더러운 경우 플러시). 추정치가 정확하고 승인이 요청 된 메모리의 100 % 인 경우 쿼리는 '유출'해서는 안됩니다. 추정치가 정확하지만 (카디널리티 추정 아래로 비등 따라서 오래된 통계의 적용을받습니다) 또는 쿼리가 쿼리 것 '유출'에 대해 물어 봤다 전체 허가를 가지고하지 않은 경우. 이것은 tempdb가 그림에 나타나고 일반적으로 탱크 성능입니다.

이 프로세스에서 무언가를 제어하는 ​​유일한 손잡이는 리소스 관리자 입니다. RG를 사용하여 풀에 대한 MIN 설정 을 지정할 수 있으므로 특정 워크로드에 대해 메모리를 예약 하여 요청한 메모리 부여를 실제로 받을 수 있습니다. 물론 적절한 조사를 수행 한 후 감소 된 메모리 부여 원인이되고 다른 작업 부하 에 대한 영향 이 평가 된 후에 나타납니다 . 그리고 물론 테스트되었습니다.

이제 원래 질문으로 돌아가겠습니다. 귀하의 조사가 정확하다면 (매우 큰 경우) 두 가지 문제를 지적하고 싶습니다.

  • 웹 사이트에 대한 메모리 부여가 필요한 프로덕션 쿼리에서 실행 합니다 . 이것은 큰 아니오입니다. 메모리 부여는 HTTP 요청을 처리 할 수없는 분석 쿼리를 나타냅니다.
  • 쿼리가 요청한 메모리 부여를받는 이벤트가 아닐 수 있습니다. 다시 말하지만, 웹 사이트와 마찬가지로 대기 시간이 중요한 워크로드에는 더 많은 문제가 없습니다.

그것이 저에게 말하는 것은 당신에게 근본적인 디자인과 건축상의 문제가 있다는 것입니다. 웹 사이트는 대기 시간을 기준으로하며 메모리 부여 및 쿼리에 대한 메모리 부담없이 워크로드와 같은 OLTP를 만들어야합니다. 유출은 말할 것도 없습니다. 분석 요청은 오프라인 작업에서 실행하고 HTTP 요청이 필요할 때 빠른 가용성을 위해 사전 처리 된 결과를 저장해야합니다.


@Mark : 대부분의 쿼리에는 메모리 부여가 필요하지 않습니다. 소수의 연산자 (주로 정렬 및 해시 조인) 만 작업 버퍼가 필요하므로 권한 부여를 요청합니다. 이것이 표준 '명칭'입니다. 실행 환경 및 쿼리 실행 계획을 생각할 수 있습니다. 각 실행 쿼리마다 하나가 필요하고 메모리가 포함되어 있습니다 . 메모리 부여는 훨씬 더 큽니다 (MB). 둘째, sys.dm_exec_query_memory_grants당신은 requested(최대), required(최소) 및 granted(실제)를 살펴보십시오 .
Remus Rusanu

사과. 쿼리 당 최소값이 동일한 메모리 담당자로부터 할당되었다는 것을 다른 곳에서 찾았습니다.
Mark Storey-Smith가

여전히 두 가지 요점에 동의하지 않습니다. 사소한 정렬 및 해시 조인 작업의 모든 방식에는 최소 수준의 보조금이 필요하므로 완전히 제거해야한다는 제안은 과도한 것으로 보입니다. 부족한 보조금으로 인한 tempdb 유출은 확실히 합리적이지만 보조금이 필요한 작업에 대한 총괄 금지는 많은 사람들을 불필요한 선제 적 최적화 경로에 놓을 수 있습니까?
Mark Storey-Smith

OP는 필요한 인덱스가 모두 있다고 주장합니다. 그것이 사실이고 작업 부하에 눈에 띄게 충분한 메모리 부여 (및 유출) 문제가 있다면 작업 부하가 웹 사이트에 대해 너무 분석적이라고 말하고 싶습니다 . 궁극적으로 성능 최적화는 항상 근본 원인을 파악하기위한 조사 게임입니다 . 모든 담요 진술과 금지는 항상 그것이 틀렸다는 것을 입증하는 반론 적 예입니다. OP에 너무 분석적인 워크로드를 생성하는 디자인 문제가 있습니까? 모르겠어요 나는 그렇게 생각합니까? 나는 87.5 %의 신뢰를 말할 것입니다.
Remus Rusanu

@ 레무스 : 당신의 추측은 좋았고, 내 웹 사이트 쿼리는 100 % 분석적입니다. 사용자는 UI에서 가능한 쿼리를 구성하여 필터, 집계 및 그룹화의 가능한 조합을 SQL Server로 보낼 수 있습니다 (물론 인덱싱을 어렵게 함). 예, 나중에 검색하기 위해 결과를 저장하는 비동기 모드로 실행할 수 있지만 목표는 쿼리를 너무 빨리 실행하여 2-10 초 후에 결과를 즉시 사용할 수 있도록하고 분석 쿼리는 해당 웹 사이트의 유일한 기능입니다 , 나는 그것들을 비동기로 만드는 것이 분석적이지 않은 다른 쿼리가있는 경우에만 의미가 있다고 생각합니다.
alpav

3

언급하지 않은 것은 데이터베이스에 대해 어떤 종류의 쿼리가 실행되고 쿼리 성능을 향상시키는 올바른 인덱스가 있는지에 대한 것입니다.

또한 동일한 상자에서 다른 응용 프로그램이 실행되고 있는지 확인해야합니다. 상자에 32GB의 RAM이 있더라도 데이터베이스 서버에서 최대 메모리 설정을 설정하여 인위적인 제한을 두십시오. 동일한 서버에서 실행되는 앱이있는 경우 SQL 및 다른 앱이 리소스를 놓고 경쟁 할 수 있으며 SQL에 메모리가 너무 많이 소모됩니다.

SQL Server는 내부 정렬 또는 해시 조인 / 집계 또는 스풀 연산자 등에 tempdb를 사용하므로이 동작을 제어 할 수 없습니다. 당신이 할 수있는 일은 반환되는 데이터의 양을 제한하는 것입니다.

이 상자에서 대기 통계를 확인 했습니까? SQL Server가 리소스를 대기 할 때마다 SQL Server는 대기 리소스를 추적하고 해당 정보를 살펴 보는 데 도움이됩니다.

Glenn Berry 진단 쿼리를 살펴보면 좋은 출발이 될 것입니다.

http://weblogs.sqlteam.com/dang/archive/2009/06/27/Forced-Parameterization-A-Turbo-Button.aspx에 언급 된대로 PARAMETERIZATION FORCED도 참조하십시오.


좋아, 이미 올바른 인덱스가 있다고 가정 해 봅시다. 이것이 읽기 전용 쿼리가있는 읽기 전용 데이터베이스이며 SQl 서버 상자에서 실행중인 다른 응용 프로그램이 없다는 것을 언급하지 않았습니다.
alpav

통계가 최신 상태입니까? 읽기 전용 데이터베이스는 누락되었거나 오래된 통계를 만들 수 없습니다. 데이터가 왜곡되었거나 키에 고유 한 값이 있습니까? 이 동작을 일으킬 수있는 많은 요소가 있습니다.
Sankar Reddy

"이 동작"은 무엇을 의미합니까? 나는 무언가 잘못되고 있다고 언급하지 않았다. 특별한 상황에서 성능을 높이고 싶습니다. SQL Server는 어떤 상황에서도 실행되도록 최적화되었지만 내 상황에서 가장 좋은 방법으로 실행되거나 실행되지 않을 수 있습니다. 균형 잡힌 선택 # 1과 # 2를 만들기 위해 SQL Server를 신뢰할 수 있는지 확실하지 않습니다. 새 데이터를 넣을 때마다 sp_updatestats를 실행합니다.
alpav


2
sp_updatestats를 실행할 때 선택한 샘플 비율은 얼마입니까? 기본 비율은 매우 샘플이며 인덱스 크기에 따라 다릅니다. 쿼리가 대부분 새 데이터를 쿼리하고 sp_updatestats를 수행하더라도 SQL Server는 실행 계획을 결정할 수 없습니다.
Sankar Reddy

2

이 질문은 현재 문제를 찾는 솔루션처럼 읽습니다. RAM 디스크가 해결책이라고 결정했으며 누군가가 그 선택을 확인하도록합니다. 미안, 일어나지 않을거야

tempdb 로의 유출을 측정하고 관찰 한 경우 정렬 또는 해시 작업과 불충분 한 쿼리 메모리 부여 때문일 것입니다. 처리 할 데이터의 양에 따라 피할 수는 없지만 쿼리 및 / 또는 인덱싱을 개선하여이를 피할 수 있습니다.

버퍼 관리 를 살펴보고 SQL Server가 메모리를 관리 하는 방법과 SQL Server 메모리 관리 를 이해하고 메모리가 할당 된 위치를 이해하기위한 기본 도구 및 DMV 쿼리에 대해 설명 합니다.

모든 처녀 SQL 쿼리의 성능을 향상시킬 수있는 방법은 무엇입니까?

이것은 큰 주제입니다. 쿼리 및 계획을 게시하면 대상 피드백이 제공됩니다.

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