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


7 Answers

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

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

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

Question

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

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

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

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




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

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

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




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

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

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




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




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




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




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

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




데이터웨어 하우징에서는 많은 수의 인덱스를 갖는 것이 일반적입니다. 필자는 200 개의 열과 190 개의 인덱스가있는 사실 테이블을 사용하여 작업했습니다.

오버 헤드가 있지만 데이터웨어 하우스에서는 일반적으로 한 번만 행을 삽입하고 업데이트하지는 않지만 수천 개의 SELECT 쿼리에 참여할 수 있다는 점을 이해해야합니다. 이러한 쿼리는 수천 개의 SELECT 쿼리에 참여할 수 있습니다. 기둥들.

최대한의 유연성을 위해 데이터웨어 하우스는 (압축 된) btree 인덱스를 사용할 수있는 상위 카디널리티 열을 제외하고 일반적으로 단일 열 비트 맵 인덱스를 사용합니다.

인덱스 유지 관리에 대한 오버 헤드는 대개 많은 블록 및 블록 분할에 대한 쓰기 비용과 관련이 있습니다. 새 행에 해당 열에 대한 기존 값 범위의 "중간"값이 추가되면서 블록 분할이 발생합니다. 이는 파티셔닝과 새로운 데이터로드가 파티셔닝 구성표와 정렬되도록하고 직접 경로 삽입을 사용하여 완화 할 수 있습니다.

더 직접적으로 귀하의 질문에 대답하기 위해, 나는 아마 처음에는 명백한 색인을 작성하는 것이 좋다고 생각하지만, 테이블에 대한 쿼리가 도움이 될 경우 더 많은 색인을 추가하는 것을 두려워하지 마십시오.



Related