김정선의 좋은 글을 찾아서……
SQL Server 2005 SP2에서 변경된 Plan Caching 동작
필라넷 DB사업부 수석컨설턴트 SQLServer 아카데미/트라이콤 교육센터 강사 Microsoft SQL Server MVP
김정선(jskim@feelanet.com)
저자: sangeethashekar, SQL Programmability & API Development Team 블로그
김정선의 의견
오랜 만의 좋은 글을 찾아서입니다 ^^
역시 전부터 계속 소개하고자 생각했던 글인데, 이제서야 올립니다.
SQL Server 2005 출시 이후, 대용량 메모리 사용이 늘어나면서 Plan Cache 용 메모리가 폭주하는 문제를 가지고 있었습니다. 그 원인이 Plan Cache를 할당하는 수식 상의 이슈가 있었는데요, SP2와 함께 변경되었다고 합니다.
대용량 메모리, 특히 64bit 장비를 운영하는 관리자 혹은 그러한 장비로의 업그레이드를 고려하고 있는 사용자라면 중요하게 알고 계셔야 할 내용일 듯 합니다.
참고로, 원문에 나와 있는 내용은 “Inside Microsoft SQL Server 2005 Query Tuning and Optimization”에 더 잘 나와 있습니다. 보다 폭 넒은 내용은 이 책을 참조해 보세요.
역시 내용이 길지 않으니 편하게 보시면 되겠습니다.
그리고 어려운 용어들이 몇 가지 있고 문맥도 힘들어서 번역에 오류가 있을 듯 합니다. 잘 아시는 분 계시면 정정해 주시면 매우 감사하겠습니다 ^^
그럼, 즐.독.하세요~~~
잠깐 질문. 혹시 이런 내용으로 세미나하면, 많이들 오실까요? ^^ (유로로...)
[본문 시작]
SQL Server 2000, 2005 RTM, 2005 SP2간의 Caching 동작 변경 사항
SQL Server 2000과 2005 RTM간의 비용 산정 알고리즘의 변화
SQL Server 2000 및 2005는 3가지 요소로 비용이 결정되는데, 디스크 IO 요청 수, 쿼리 컴파일 동안 Context Switch 수, 메모리 페이지 수(단일 또는 다중 페이지 할당자 모두). SQL Server 2005에서는 쿼리의 원본 비용이 2의 제곱에 해당하며, 디스크 IO, Context Switch, 메모리 페이지 비용에 대한 합을 그 지수로 한다.
수학적으로
Cost = 2 min (IO > 0 ? (IO - 1) / 2 + 1 : 0, 19) + min (CS > 1 ? (CS - 1) / 2 + 1 : 0, 8) + min (MP / 16, 4)
여기서
IO – IO 요청 수(바이트 수에 무관),
CS – Context Switch 수,
MP – 메모리 페이지 수(단일 혹은 다중 페이지 할당자)
Context Switch 지수는 다음과 같다: a) 1미만의 context switch을 가진 쿼리는 지수가 0이다. 두 번이면 지수는1이다. 2를 초과하는 2의 배수는 지수가 1씩 증가하며 최대 8을 가진다. 디스크 I/O 지수는 디스크 IO가 0이면 똑같이 0이다. 역시 2의 배수로 지수가 1씩 증가하며 최대 19를 가진다. 메모리 페이지 지수는 16의 배수로 나누어지며 최대 4를 가진다. 예를 들어 Disk IO 0, context switch 4, 메모리 페이지 2이면, 해당 쿼리의 원본(초기) 비용은 2 (0 + 2 + 0) = 4가 된다.
SQL Server 2005 비용은 Plan cache 메모리 페이지에 비례한 반면, SQ Server 2000은 메모리 페이지에 반 비례하게 계산된다. 따라서 대량 메모리 페이지를 사용하는 쿼리의 경우 SQL Server 2000에서는 캐시되지 않지만, SQL Server 2005에서는 캐시된다. 업그레이드의 경우 이러한 쿼리가 많은 작업 부하를 가진 시스템이라면 Plan cache 크기가 상당히 증가할 것이다.
(역주. 무슨 말인지 이해 되시나요? 조금 애매하죠? 저두요…… ^^;)
SQL Server 2005 SP2에서 향상된 Plan Cache 동작
- Plan cache 항목(entry)의 생성 및 제거 시 충돌 감소
SQL Server 2005 RTM과 SP1에서 동적 쿼리의 컴파일 계획에 대한 Descriptor를 위해 하나의 할당자가 있었다. Descriptor는 컴파일 계획의 일부로서 컴파일 계획을 plan cache에 추가할 때 생성되며 반대로 제거될 때 같이 삭제된다. 이 때 하나의 Descriptor에 대한 충돌로 인해서 응용 프로그램 처리량의 40%가 감소되거나 메모리 부족과 같은 심각한 문제를 유발하기도 했다. SP2에서 이러한 충돌을 줄이기 위해 각 CPU 단위로 분할해서 할당하며, 기존 문제를 해결하는데 도움을 준다.
- 모든 NUMA 모드에 걸쳐 공정하게 cache 항목 제거 수행
NUMA(non-uniform memory access)로 구성된 서버에서 다중 NUMA 노드가 존재하고 각 노드 별로 캐시를 가진다. SQL Server는 cache 항목 제거(퇴거)에 의한 메모리 압박에 반응한다. SQL Server 2005 RTM과 SP1에서 작은 캐시를 가진 노드로 인해 여러 번의 캐시 제거 동작이 반복될 수 있었다. 예를 들어, 작은 메타데이터 캐시 항목은 주기적으로 재 생성되고 이로 인해 스키마 변경 잠금(Sch-m)에 충돌을 유발할 수 있다. 이러한 충돌로 전체 처리 성능이 떨어질 수 있다. SP2에서, 전체 NUMA 모드에 걸쳐 골고루 캐시 항목 제거 정책을 처리함으로써, 이러한 문제를 줄일 수 있다.
(역주: Local 메모리 압박의 대한 NUMA 구성의 기존 문제점을 언급하고 있는 것 같습니다 à 책에 잘 설명되어 있습니다.)
- SQL Server 2000에서와 유사한 Plan cache 크기 배정
SQL Server 2005 RTM및 SP1에서 Plan Cache의 최대 크기가 2000 대비 상당히 커졌다. SQL Server 20052 SP에서 이를 조정했다. 다음 표를 참조.
SQL Server 버전 |
Cachestore에 대한 내부 메모리 압박 시점 표시 |
SQL Server 2005 RTM & SP1 |
75% of server memory from 0-8GB + 50% of server memory from 8Gb-64GB + 25% of server memory > 64GB |
SQL Server 2005 SP2 |
75% of server memory from 0-4GB + 10% of server memory from 4Gb-64GB + 5% of server memory > 64GB |
SQL Server 2000 |
SQL Server 2000 4GB upper cap on the plan cache |
예:
32GB를 가진 SQL Server의 경우, SQL Server 2005 RTM및 SP1에서는 75% X 8 + 50% X (32 - 8) = 18GB가 된다.
반면에 SQL Server 2005 SP2 는 75% X 4 + 10% X (32-4) = 5.8GB로 줄어든다.
참고: Plan cache에 대한 또 다른 내부 메모리 압박은 32비트에서 4만개 이상의 항목, 그리고 64비트에서 16만개 이상일 경우이다.
(역주: 이 부분도 책을 참조하는 것이 좋을 듯 합니다……소개가 조금 다른 듯 합니다)
- 일부 0 비용 계획을 캐시하지 않도록 구성하여, 캐시 항목을 감소시킨다
SQL Server 2005 RTM, SP1, SP2에서 컴파일 계획의 비용은 컴파일 계획의 크기와 컴파일하는 IO 및 CPU에 비례한다. 컴파일 계획은 특정 임계 값 이하는 비용 0으로 감안한다. SQL Server 2005 RTM과 SP1에서 하나의 SET 문 혹은 하나의 트랜잭션 문(begin/commit/save/rollback transaction 문)을 포함한 동적 배치에 대한 비용 0의 컴파일 계획이 캐시되었다. SP2에서 이러한 계획은 더 이상 캐시되지 않는다.
예외로는,
a) 배치 내 모든 문이 set (옵션) 문인 경우, SP2는 비용 0라도 캐시
b) 배치 내 모든 문이 IF 문과(혹은) 트랜잭션 문의 경우, SP2는 캐시
역주)위 내용 a, b 또한 이해가 잘 안되는……누가 설명 좀 해 주세요 ^^;
SP2의 이러한 변화로 비용 0이며 거의 재사용이 어려운 동적 배치에 대한 캐시 소비를 줄일 수 있다.
결론, SP2 꼭 설치하라는 얘기네요 ^^
'데이터베이스 > SQL Server' 카테고리의 다른 글
SQL Server 인덱스 구성 전략(시리즈-4. 정렬되지 않은 파티션 인덱스) (0) | 2008.04.30 |
---|---|
Sorted Seeks 문제 (0) | 2008.04.29 |
차집합 구하기, 어떤 쿼리가 좋을까? (1) | 2008.04.29 |
[펀글] KILL UOW, 제발 사라져 줘~ (0) | 2008.04.29 |
암시적 소유자로 인한 CacheMiss 한 방에 해결하기 (0) | 2008.04.29 |