얼마나 많은 데이터베이스 인덱스가 너무 많습니까? [database]


Answers

나는 보통 이렇게 진행한다.

  1. 일반적인 날 데이터에서 실행 된 실제 쿼리의 로그를 가져옵니다.
  2. 인덱스를 추가하여 가장 중요한 쿼리가 실행 계획의 인덱스를 조회합니다.
  3. 업데이트 또는 삽입이 많은 필드의 색인 생성을 피하십시오.
  4. 몇 가지 색인을 작성한 후 새 로그를 얻고 반복하십시오.

모든 최적화와 마찬가지로 요청 된 성능에 도달하면 중지합니다 (이는 명확하게 0 점이 특정 성능 요구 사항을 얻고 있음을 의미 함).

Question

나는 오라클 데이터베이스가 상당히 큰 프로젝트를 작업 중입니다. 물론 제 질문은 다른 데이터베이스에도 똑같이 적용됩니다. Google은 사용자가 가능한 모든 필드 조합을 검색 할 수있는 웹 인터페이스를 제공합니다.

이러한 검색을 빠르게 수행하기 위해 사용자가 일반적으로 검색 할 것으로 판단되는 필드 및 필드 조합에 색인을 추가합니다. 그러나 고객이이 소프트웨어를 사용하는 방법을 알지 못하기 때문에 어떤 색인을 작성해야하는지 알기가 어렵습니다.

공간은 문제가되지 않는다. 우리는 4 테라 바이트 급의 RAID 드라이브를 가지고 있습니다. 그러나 인덱스가 너무 많으면 성능이 저하 될 수 있습니다. 이러한 인덱스는 행이 추가, 삭제 또는 수정 될 때마다 업데이트해야하기 때문에 단일 테이블에 수십 개의 인덱스를 포함시키는 것이 좋지 않을 것이라고 생각합니다.

얼마나 많은 인덱스가 너무 많은 것으로 간주됩니까? 10? 25? 50? 아니면 내가 정말로, 정말로 공통적이고 분명한 경우를 다루고 다른 모든 것을 무시해야합니까?




단순함에 대한 아인슈타인 의 의역에서, 필요 이상으로 많은 색인을 추가하십시오.

그러나 실제로 추가하는 모든 색인은 데이터가 테이블에 추가 될 때마다 유지 보수가 필요합니다. 주로 읽기 전용 인 테이블에서 많은 인덱스가 좋은 것입니다. 매우 동적 인 테이블의 경우 더 적은 수입니다.

제 조언은 공통적이고 분명한 경우를 다루는 것입니다. 그런 다음 특정 테이블에서 데이터를 가져 오는 데 더 많은 속도가 필요한 문제가 발생하면 그 시점에서 인덱스를 평가하고 추가하십시오.

또한 몇 달에 한 번씩 색인 체계를 재평가하는 것이 좋습니다. 색인 생성이 필요한 새로운 것이 있는지 또는 사용자가 작성한 색인이 무엇이든 사용되지 않고 없어져야하는지 확인하는 것입니다. .




다른 모든 사람들이 제기 한 포인트 외에도 비용 기반 옵티마이 저는 더 많은 조합을 고려해야하기 때문에 더 많은 인덱스가있는 경우 SQL 문의 계획을 작성할 때 비용이 발생합니다. SQL 문이 SQL 캐시에 남아 있도록 바인드 변수를 올바르게 사용하여이 값을 줄일 수 있습니다. 그런 다음 오라클은 지난 번 발견 한 계획을 다시 분석하고 소프트 구문 분석을 수행 할 수 있습니다.

언제나 그렇듯이 단순한 것은 없습니다. 왜곡 된 열과 히스토그램이 포함 된 경우 이는 잘못된 생각 일 수 있습니다.

우리의 웹 응용 프로그램에서는 허용되는 검색 조합을 제한하는 경향이 있습니다. 그렇지 않으면 누군가가 언젠가 찾을 수있는 숨어있는 문제가 발생하지 않도록 성능면에서 문자 그대로 모든 조합을 테스트해야합니다. 또한 리소스 제한을 구현하여 문제가 발생하면 응용 프로그램의 다른 곳에서 문제를 일으키는 것을 막습니다.




궁극적으로 필요한 인덱스의 수는 데이터베이스 서버 위에 올라가는 응용 프로그램의 동작에 따라 달라집니다.

일반적으로 인덱스 삽입이 많을수록 인덱스가 더 고통스러워집니다. 삽입 할 때마다 해당 테이블을 포함하는 모든 인덱스를 업데이트해야합니다.

이제 응용 프로그램에 알맞은 양의 읽기가 있거나 거의 모든 읽기가있는 경우 훨씬 적은 비용으로 큰 성능 향상이 나타나기 때문에 색인을 만드는 방법이 있습니다.




고려해야 할 한 가지는 표준 검색 조합을 목표로 색인을 작성하는 것입니다. column1이 일반적으로 검색되고 column2가 자주 사용되며 column3이 column2 및 column1과 함께 사용되는 경우 해당 순서로 column1, column2 및 column3의 색인을 이러한 세 가지 상황에 사용할 수 있습니다. 하나의 색인 만 유지해야합니다.




이것은 실제로 실용적인 것보다 더 이론적 인 질문입니다. 어제 Oracle은 11g 데이터베이스로 10 배 빠른 성능을 발휘할 것으로 예상되는 HP의 전용 스토리지를 발표 한 것으로 들었습니다. 귀하의 경우에는 여러 가지 해결책이있을 수 있습니다 : 1. 많은 양의 색인 (> 20)을 가지고 매일 (야간에) 다시 작성하십시오. 테이블에 수천 건의 업데이트 / 삭제가 매일 발생하는 경우 특히 유용합니다. 2. 테이블을 분할합니다 (데이터 모델이 적용되는 경우). 3. 새 / 업데이트 된 데이터에 대해 별도의 테이블을 사용하고 데이터를 함께 결합하는 야간 프로세스를 실행합니다. 이렇게하려면 응용 프로그램 논리를 변경해야합니다. 4. 데이터가이를 지원하면 IOT (인덱스 구성 테이블)로 전환하십시오.

물론 그러한 경우에 대한 더 많은 해결책이있을 수 있습니다. 나의 첫 번째 제안은 DB를 개발 환경에 복제하고 이에 대한 스트레스 테스트를 실행하는 것입니다.




몇 개의 열이 있습니까? 필자는 항상 다중 열 인덱스가 아닌 단일 열 인덱스를 작성하라고했습니다. 칼럼의 양보다 더 많은 인덱스가 필요하지 않습니다.




SQL Server는 어떤 인덱스가 실제로 사용되고 있는지 확인할 수있는 좋은 도구를 제공합니다. 이 기사 ( http://www.mssqltips.com/tip.asp?tip=1239 )에는 색인이 얼마나 많이 사용되는지에 대한 더 나은 통찰을 얻을 수있는 쿼리가 제공됩니다.