SQL Server 2008에서 인덱스가 메모리에 유지되도록하는 방법이 있습니까?


10

수백만 개의 행이있는 테이블이 있는데 때때로 쿼리를 실행해야합니다. 첫 번째 쿼리는 일반적으로 매우 느리고 (약 10 초), 후속 쿼리는 일반적으로 더 빠릅니다 (약 1 초). 몇 시간 후에 느리고 빠른 사이클이 다시 시작됩니다.

실행 계획에서 필요한 모든 인덱스가 존재하고 적절하게 사용되었는지 확인했으며 성능 차이는 인덱스가 실제로 후속 쿼리를 위해 메모리에 있다는 사실 때문이라고 가정합니다. 가능한 원인들?)

또한 인덱스를 사용하여 다른 많은 쿼리를 실행하고 있지만 이러한 쿼리는 시간이 덜 걸리고 성능이 덜 중요하므로 인덱스가 실제로 중요한 인덱스를 메모리 캐시에서 밀어내는 것이 걱정됩니다.

명백한 'Add more RAM'픽스와는 별도로, 인덱스를 메모리에 다시 강제로 매시간 실행하도록 더미 쿼리 스크립팅에 대해 생각하고 있습니다.

더 우아한 방법이 있습니까? 하나의 단일 인덱스를 캐시로 유지하기에 충분한 메모리 만있는 경우 SQLServer에 힌트를주는 방법과 같습니다.

나는 일반적으로 최선의 방법은 그러한 종류의 것들과 관련하여 SQLServer를 엉망으로 만드는 것이 아니라 내 쿼리의 특이한 특성 (매우 드물게 실행되지만 시간이 중요한)은 그것이 가능할 것이라고 생각하게 만드는 것입니다. .

또한 주어진 시간에 어떤 인덱스가 메모리에 캐시되는지 알 수있는 방법이 있는지 궁금합니다.

답변:


13

예전에는 DBCC PINTABLE명령이 있었지만 6.5 또는 7.0에서 작동이 중지되었다고 생각합니다. 이 문장은 아마도 당신이 그것을 시도해도 효과가 있다고 제안 할 것입니다 . 그러나 그것은 단지 반환합니다.

불행히도 캐시에 보관할 인덱스를 제어 할 수있는 방법은 없습니다. 주기적으로 핫 테이블에 대해 알고있는 가장 좋은 해결 방법은 수동으로 핫 상태를 유지하는 것입니다 (이미 질문에 설명되어 있음).

어떤 인덱스가 메모리에 있는지에 대해 대략적인 아이디어를 얻을 수 있습니다 sys.sm_os_buffer_descriptors. 나는 이것에 대한 팁을 발표했다.

http://www.mssqltips.com/sqlservertip/2393/determine-sql-server-memory-use-by-database-and-object/


흠, 그 스크립트에 따르면 75MB 테이블이 900MB의 버퍼 풀을 차지하고 있습니다. 그게 정상인가요?
db2

1
@ db2 얼마나 많은 인덱스가 있습니까?
JNK

2
또한 데이터가 아닌 페이지를 측정하고 있습니다. 페이지가 상대적으로 비어있을 수 있으며 이로 인해 부풀려 질 수 있습니다.
Aaron Bertrand

0

힌트를 사용 KEEPPLAN하고 KEEPPLAN FIXED 쿼리 하십시오 .

KEEPPLAN은 쿼리 최적화 프로그램이 쿼리에 대한 예상 재 컴파일 임계 값을 완화하도록합니다.

KEEPFIXED PLAN은 통계 변경으로 인해 쿼리 최적화 프로그램이 쿼리를 다시 컴파일하지 않도록합니다. KEEPFIXED PLAN을 지정하면 기본 테이블의 스키마가 변경되거나 해당 테이블에 대해 sp_recompile이 실행되는 경우에만 쿼리가 다시 컴파일됩니다.

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