우리 프로젝트는 매우 크고 매우 복잡한 데이터베이스를 운영합니다. 약 한 달 전에 null 값을 포함하는 인덱싱 된 열이 사용하는 공간이 너무 커지고 있음을 알았습니다. 이에 대한 응답으로 1 % 이상의 null 값을 포함하는 모든 단일 열 인덱스를 동적으로 검색하는 스크립트로 작성한 다음 값이 NULL이 아닌 조건에서 해당 인덱스를 필터링 된 인덱스로 삭제하고 다시 만듭니다. 이는 데이터베이스 전체에 수백 개의 인덱스를 삭제하고 다시 생성하며 일반적으로 전체 DB가 사용하는 공간의 거의 15 %를 확보합니다.
이제 이것에 대해 두 가지 질문이 있습니다.
A) 이런 방식으로 필터링 된 인덱스를 사용하면 어떤 단점이 있습니까? 성능 만 향상시킬 것이라고 생각하지만 성능 위험이 있습니까?
B) 우리는 나중에 검사 할 때 모든 것이 예상대로 정확하게 진행되었지만 인덱스를 삭제하고 다시 만드는 데 오류 ( 'XYZ가 존재하지 않거나 권한이 없기 때문에 인덱스 XYZ를 삭제할 수 없습니다' )를 받았습니다 . 어떻게 이런 일이 일어날 수 있습니까?
도움을 주셔서 감사합니다!
편집 : @Thomas Kejser 님의 질문에 답변
안녕하세요, 감사합니다. 그러나 이것은 재앙이었습니다. 당시 우리는 다음과 같은 몇 가지 사항을 이해하지 못했습니다.
- 쿼리 중에 SQLOS는 테이블 열 조인에 NULL 값을 사용할 수없는 것으로 결정하기 전에 인덱스 계획을 만듭니다. IE에서는 쿼리에 사용 된 모든 필터링 된 인덱스에 대해 인덱스에 맞는 WHERE 절 필터가 있어야합니다. 그렇지 않으면 인덱스가 전혀 사용되지 않습니다.
- 인덱스를 삭제 및 작성하고 통계를 중복 업데이트 한 후에도 업데이트 된 계획을 작성하기에 충분하지 않을 수 있습니다. 일부 경우에는 작업량이 충분하기 때문에 SQL Server에서 계획을 다시 평가해야합니다.
- 상식과 논리만으로는 판단하기 어려운 실행 플래너의 기능에는 몇 가지 이색적인 것이 있습니다. 다른 쿼리의 수천 가지 코드 숨김 생성 변형으로도 쓸모없는 인덱스는 중요한 쿼리에 사용되는 일부 통계 및 쿼리 계획에 도움이 될 수 있습니다.
결국 이러한 변경 사항이 되돌려졌습니다. 따라서 필터링 된 인덱스는 강력한 도구이지만 해당 열에서 어떤 데이터를 가져 오는지 정확하게 이해해야합니다. 공간 문제를 제외하고 일반 인덱스를 적용하기가 쉽지 않은 경우 필터링 된 인덱스는 매우 맞춤화 된 솔루션을 나타냅니다. 그것들은 확실히 일반 인덱스를 대체하는 것이 아니라 필요한 특별한 상황에서 확장됩니다.