Christian Bolton, Brent Ozar 등의 SQL Server 2008 내부 및 문제 해결 (일리노이의 로컬 라이브러리에서 빌려온)에 대한 나의 독서 책에 따르면 SQL 서버에 대한 이해와 확인을 구하고 웹에서 많은 검색을 시도하고 있습니다. 내 이해를 확인하거나 수정할 수 있습니다.
쿼리 메모리 부여가 필요한 모든 쿼리 또는 작업에는 작업 공간 메모리가 필요합니다. 일반적으로 정렬, 해시 일치 조인, 병렬 처리 (확실하지 않음), 대량 삽입 (확실하지 않음), 인덱스 재구성 등을 사용하는 쿼리에는 쿼리 작업 영역 메모리가 필요합니다.
작업 공간 메모리는 SQL Server 버퍼 풀의 일부이며 (버퍼 풀의 일부로 할당 됨) 최대 작업 공간 메모리는 버퍼 풀에 할당 된 메모리의 75 %입니다. 기본적으로 단일 쿼리는 작업 공간 메모리의 25 %를 초과 할 수 없습니다 (SQL 2008 / SQL 2012의 경우 기본적으로 리소스 관리자 기본 작업 그룹에 의해 제어 됨).
내 이해의 확인을 추구
1) 48GB RAM과 최대 서버 메모리가 40GB로 구성된 시스템을 고려하면 최대 작업 공간 메모리가 30GB로 제한되고 단일 쿼리가 작업 공간 메모리 (쿼리 메모리)를 10GB 이상으로 가져올 수 없음을 의미합니다. 따라서 대규모 해시 조인을 수행하고 10GB 이상의 메모리 (작업 공간 메모리)가 필요한 10 억 행으로 나쁜 쿼리를 수행하는 경우이 메모리 부여 대기열을 통과하거나 디스크에 즉시 유출해야합니까?
2) 대량 정렬 작업을 수행하는 쿼리에 5MB의 작업 영역 메모리가 할당되고 쿼리의 쿼리 실행 중 쿼리 최적화 프로그램이 잘못된 통계 또는 인덱스 누락으로 인해이 쿼리에는 실제로 30MB 의 작업 영역 메모리 가 필요하다는 것을 인식하는 경우 tempdb에 즉시 유출됩니다. 실행하는 동안 쿼리가 허용 된 작업 영역 메모리를 초과하면 실행 중에 시스템에 사용 가능한 작업 영역 메모리가 충분하더라도 디스크에 유출되어야합니다. 내 이해가 정확합니까?
답변
이 메모리 부여 대기열을 통과하거나 디스크에 즉시 유출해야합니까?
그런 식으로 작동하지 않습니다. 메모리 부여가 필요한 계획이 선택되면 쿼리는 부여를 얻어야 큐를 통과하게됩니다. 유출은 실행주기에서 훨씬 늦게 발생합니다. 쿼리는 그랜트와 ‘유출’없이 진행하기로 결정할 수 없습니다. 보조금을 받아야하고, 기본 기부금을 받으면 실행을 시작해야합니다. 보조금 이 불충분 한 것으로 판명되면 (불량한 추정으로 인해 또는 요청 된 것보다 훨씬 낮은 보조금을 얻었 기 때문에) 쿼리가 유출됩니다.
쿼리 최적화 프로그램이 잘못된 통계 또는 누락 된 인덱스로 인해이를 인식하는 경우
엄밀히 말하면 최적화 프로그램이 아니며 쿼리 실행입니다. Query Optimizer는 계획을 결정할 때 언급 할 뿐이지 만 일단 계획이 선택되고 실행되면 Optimizer가 그림에서 벗어날 수 있습니다. 또한 ‘누락 된 인덱스’는 아무런 역할을하지 않습니다. 누락 된 인덱스는 잘못된 계획을 강요 할 수 있지만, 실제로 어떤 인덱스가 존재하는지 정확하게 고려하여 계획이 구축되어 ‘할 수없는’것을 정확히 알 수 있으므로 ‘나쁜’계획이 실행되는 방식에 영향을 줄 수 없습니다. 유출은 거의 항상 잘못된 추정치 때문에 발생합니다. 옵티 마이저 와 실행에서 나쁜 통계 또는 나쁜 카디널리티 추정 알고리즘 (세부 사항을 파헤 치면 정말 복잡하므로 여기서 멈 춥니 다).
실행하는 동안 쿼리가 허용 된 작업 영역 메모리를 초과하면 실행 중에 시스템에 사용 가능한 작업 영역 메모리가 충분하더라도 디스크에 유출되어야합니다.
불행히도, 그렇습니다. 그러나 최적화 해야 가능한 RAM을 활용하는 계획을 마련.
내가 읽어 보시기 바랍니다 이해 SQL 서버 메모리 부여하는 바이 주제에 가장 좋은 정보입니다 넓은 여백.