운영 중인 SQL Server 데이터베이스의 불필요한 인덱스를 찾는 방법은 무엇입니까?

운영 중인 SQL Server 데이터베이스의 불필요한 인덱스를 찾는 방법은 무엇입니까?

데이터베이스의 공간 낭비 외에도 SQL Server의 불필요한 인덱스로 인해 삽입 및 업데이트 작업이 느려질 수 있습니다. 데이터베이스 원칙에 대한 경험이 부족한 개발자는 실행 중인 쿼리에 적합하지 않은 테이블 인덱스를 생성하는 경향이 있습니다.

데이터베이스 작업 부하를 분석하고 특정 운영 데이터베이스에서 어떤 인덱스가 절대 사용되지 않거나 필요하지 않은 힌트를 제공하기 위한 SQL Server 2005/2008용 공통 절차나 도구가 있습니까?

감사합니다!

답변1

여기에 귀엽고 작은 T-SQL 스크립트가 있습니다(http://blog.sqlauthority.com/2008/02/11/sql-server-2005-find-unused-indexes-of-current-database/)를 사용하여 SQL Server 2005에서 실행해야 하는 사용되지 않은 인덱스를 표시합니다.http://aspadvice.com/blogs/ssmith/archive/2008/03/31/Find-Unused-SQL-2005-Indexes-for-Current-DB.aspx여기도.

dm_db_index_usage_stats가 이 모든 것의 핵심인 것 같습니다. 꽤 깔끔한! (보다http://msdn.microsoft.com/en-us/library/ms188755.aspx 이 통계가 어떤지 확인하려면 지금 만든 일부 프로덕션 데이터베이스를 살펴봐야 합니다. (웃다)

편집: 여기에 아주 멋진 추가 배경이 있습니다.http://blogs.msdn.com/craigfr/archive/2008/10/30/what-is-the-difference-between-sys-dm-db-index-usage-stats-and-sys-dm-db- 인덱스 운영-stats.aspx

답변2

sys.dm_db_index_usage_stats 사용에 관해 염두에 두어야 할 몇 가지 사항은 다음과 같습니다.

  1. 출력에는 데이터베이스가 마지막으로 시작된 이후 사용된 인덱스만 포함됩니다. 데이터베이스가 종료되면 해당 데이터베이스에 대한 메모리 내 정보 캐시의 모든 항목이 제거됩니다. 마찬가지로 캐시는 즉시 다시 시작해도 유지되지 않습니다. 데이터베이스를 다시 시작하지 않고 특정 데이터베이스에 대한 항목을 수동으로 지울 수 있는 방법은 없습니다. 첫 번째 답변(및 내 블로그)에서 참조된 다양한 기사에서는 시계열 분석을 수행하기 위해 다양한 시간에 출력을 캡처하는 방법을 설명합니다.
  2. 반드시 테스트해 보세요.전체사업주기. 월말 보고서나 CEO 쿼리에 사용되는 인덱스를 제거하고 싶지는 않을 것입니다.
  3. 지수가 수익성 있게 사용되고 있는지, 아니면 단순히 비용을 들여 유지되고 있는지 결정하기 전에 다양한 수치와 그 의미를 이해했는지 확인하세요.

도움이 되었기를 바랍니다.

추신: 이 글을 읽고 SQL Server 2000에 동등한 방법이 있는지 궁금해하는 다른 사람들을 위해 한 가지 더 말씀드립니다. 아니요, 우리(당시 팀에 있었으므로)는 2005 이후 버전에만 기능을 추가했습니다.

답변3

이를 수행하기 위한 스크립트가 포함된 SQLServerPedia의 위키 기사와 이를 사용하는 방법에 대한 튜토리얼 비디오가 있습니다.

사용되지 않는 인덱스를 찾는 방법:

http://sqlserverpedia.com/wiki/Find_Indexes_Not_In_Use

그리고 추가해야 할 인덱스를 찾기 위한 또 다른 방법은 다음과 같습니다.

http://sqlserverpedia.com/wiki/Find_Missing_Indexes

답변4

나는 인덱스 관련 쿼리를 수행했고 이를 내 블로그에 표시했습니다(http://dbalink.wordpress.com/2008/11/09/how-to-finding-index-usage-stats-with-dmv-in-tsql/)

관련 정보