인덱스가 메모리를 소비합니까?


10

SQL Server의 메모리 사용에 대해 배우기 시작했습니다. 질문 SQL Server 2008 R2 "Ghost Memory" 에 대한 답변으로 쿼리를 사용할 때 ? , 나는 단일 데이터베이스가 버퍼 풀에서 공간의 가장 큰 부분을 차지하고 있음을 발견했습니다. 더 찾고 사용 sys.allocation_units하고 sys.indexes,이이 가능성이 데이터베이스의 인덱스를 많이 사용으로 인해 발생 확인했다. 대부분의 인덱스가 클러스터됩니다.

다른 데이터베이스 개발자는 서버에 메모리 문제가 있다고 생각합니다. 사용 가능한 메모리가 없기 때문에 쿼리가 오래 실행되기 시작했습니다.

내 질문은-이 인덱스의 사용과 버퍼 풀에 존재하는 다른 프로세스에 사용 가능한 메모리를 제거합니까?


2
"Another database developer believes we are having memory issues on the server"-무엇을 기준으로? 서버의 RAM 용량, 인스턴스 메모리 설정 및 프로 시저 캐시에서 사용중인 메모리 용량은 얼마입니까?
Jon Seigel

쿼리 시간이 길어지고 작업 관리자를 보면 내 연구에서 "더러운 불결한 거짓말 쟁이"(Brent Ozar-brentozar.com/archive/2011/09/… ) 덕분에 나타났습니다 . 메모리 문제가 없음을 알 수 있습니다.이 의견과 답변에 제공된 모든 제안을 따르고 있습니다!
JHFB

2
우리가 여기에 8 개의 공을 굴리고 있기 때문에, 나는 그 '또 다른'데이터베이스 개발자에 의해 쓰여졌 기 때문에 쿼리가 느리게 실행된다고 생각합니다 ...
Remus Rusanu

답변:


12

. 버퍼 풀에 캐시 된 사용 된 인덱스의 데이터 페이지는 데이터 캐시에서 공간을 차지합니다 . 그러나 인덱스를 사용하지 못하게하십시오 (먼저 클러스터형 인덱스는 실제 테이블 데이터이므로 명심하십시오). 인덱스를 사용하는 것 (물론 적절하게 디자인되고 구현 된 것)은 좋은 것입니다.

메모리 문제는 테이블에 인덱스가없는 것 같습니다 . 메모리 문제에 뛰어 들어, 정확히 무엇이 문제입니까? 당신은 저가 있습니까 페이지 예상 수명을 ? 서버에서 메모리는 어떻게 구성되어 있습니까? 최대 서버 메모리가 버퍼 풀의 크기를 제한하도록 낮습니까?

데이터 캐시에서 색인 페이지를 분석하려면 아래 쿼리를 실행하십시오.

select
    count(*) as total_page_count,
    count(*) * 8 as total_consumption_kb,
    sum(row_count) as total_row_count
from sys.dm_os_buffer_descriptors
where page_type = 'INDEX_PAGE'
group by page_type

데이터베이스별로 이러한 통계를 얻으려면 :

select
    db_name(database_id) as database_name,
    count(*) as total_page_count,
    count(*) * 8 as total_consumption_kb,
    sum(row_count) as total_row_count
from sys.dm_os_buffer_descriptors
where page_type = 'INDEX_PAGE'
group by database_id
order by total_consumption_kb desc

괜찮은 (?) 페이지 수명-4234. 버퍼 캐시 적중률을 조사하고 다른 부분을 조사해야합니다.
JHFB

그 PLE은 메모리 압력을 전혀 나타내지 않습니다. 경험에 비추어 볼 때 1000 이상은 물론 가능합니다 (물론 항상 "의존").
토마스 스트링거

버퍼 캐시 적중률은 매우 오해의 소지가 있거나 쓸모가 없습니다. @JonathanKehayias의 훌륭한 SQL Server 토론 : 버퍼 캐시 적중률을 참조하십시오 .
Mark Storey-Smith

@ MarkStorey-Smith 참고, 포인터 주셔서 감사합니다!
토마스 스트링거

@JHFB 한발 물러나 보자. 메모리 압박이 있다고 생각하는 이유는 무엇입니까?
토마스 스트링거

7

인덱스는 버퍼 풀 공간을 소비합니다. 이것이 인덱싱 전략을 관리하고 중복을 최소화해야하는 또 하나의 이유입니다.

데이터베이스에서 인덱스를 많이 사용했기 때문일 수 있습니다. 대부분의 인덱스가 클러스터됩니다.

클러스터형 인덱스 가 테이블 임을 기억하십시오 . 힙에 대한 것 이상의 클러스터 된 인덱스에 대해 존재하는 유일한 오버 헤드는 일반적으로 바람직하지 않은 리프가 아닌 인덱스 페이지 및 해당 테이블의 모든 비 클러스터형 인덱스에 포함 된 클러스터 키에 대한 것입니다. 이것이 좁은 클러스터 키가 선호되는 이유입니다.

클러스터 된 키 선택 에 대한 Kimberley Tripp의 기사 는이를위한 훌륭한 참고 자료입니다.


+1 Trips의 기사는 클러스터링 키에 대한 EPIC입니다 ...
Fabricio Araujo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.