2009-11-16 4 views
2

가입하거나 쿼리하는 모든 열에 인덱스를 만들어야한다고 들었습니다. 기준이 간단하다면 데이터베이스가 필요한 인덱스를 자동으로 만들 수없는 이유는 무엇입니까?데이터베이스가 필요한 인덱스를 지능적으로 생성하지 않는 이유는 무엇입니까?

+1

일반적으로 그렇게 간단하지 않기 때문에! 대부분의 경우와 마찬가지로 –

+0

에는 트레이드 오프가 있습니다. –

답변

0

데이터베이스는 단순히 데이터를 저장하고 검색하기 때문에 데이터베이스 엔진은 실제로 수행 할 때까지 데이터를 검색하는 방법을 알지 못합니다.이 경우 인덱스를 작성하기에는 너무 늦습니다. 그리고 합류하는 열은 효율적인 색인에 적합하지 않을 수 있습니다.

+0

왜 너무 늦습니까? 나는 당신이이 데이터베이스에 대해 하나의 쿼리 만 실행하는 것이 아니라고 가정합니다. 잠재적으로 패턴을 감시하고 그에 따라 업데이트 할 수 있습니다. 물론, 그것은 DB가 여러분이이 방법으로 계속해서 사용할 것이라는 가정을해야한다는 것을 의미합니다. 그러나 그것은 가능합니다. – mpen

+0

이것은 반드시 사실 일 필요는 없습니다. RDMS는 필드의 유형과 제약 조건을 알고 있으므로 필요에 따라 새로운 색인을 생성 할 수 있습니다. 이것은 가능하지만 RDBMS가 조각화 및 기타 문제점을 피하기 위해 새로운 색인을 작성하기 전에 기존 색인을 광범위하게 분석해야하므로 확장성에 도움이되지 않습니다. –

0

RDBMS는 적합하다고 생각되는 색인을 쉽게 자체 조정하고 색인을 생성 할 수 있지만 이는 실행 계획이 까다로운 쿼리의 간단한 경우에만 작동합니다. 대부분의 인덱스는 특정 용도로 최적화되도록 만들어지며 이러한 종류의 최적화는 수동으로 처리하는 것이 좋습니다.

+0

디스크 공간 사용량이 지붕을 통과 할 가능성이 있습니다. 사람들이 색인을 생성 할 때 여전히 신경을 쓰고 있다면. – jason

2

글쎄, 그들은; 어느 정도는 적어도 ...

SQL Server Database Engine Tuning Advisor을 참조하십시오.

그러나 최적의 인덱스를 만드는 것은 언급 한 것처럼 간단하지 않습니다. 더욱 단순한 규칙은 모든 칼럼에 대한 인덱스를 생성하는 것입니다 (이것은 최적이 아닙니다).

색인은 무료가 아닙니다. 저장 비용으로 인덱스를 만들고 다른 것들과 비교하여 성능을 업데이트하십시오. 그들은 신중하게 최적으로 생각해야합니다.

0

문제를 해결하는 것이 중요하지 않으며 대부분의 경우 최적 이하의 자동 솔루션이 문제를 악화시킬 수 있습니다. 자동 인덱스 생성으로 읽기 작업 속도가 빨라지지만 인덱스 관리 오버 헤드의 결과로 삽입 및 업데이트가 발생하는 데이터베이스를 상상해보십시오. 그것이 좋은지 나쁜지는 데이터베이스의 특성과 그것이 제공하는 애플리케이션에 달려 있습니다.

한 가지 해결책이 있다면 데이터베이스는 확실히 이러한 작업을 수행 할 것입니다.이 최적화 방법을 정확하게 제시 할 수있는 도구가 있습니다. 그러나 데이터베이스 성능을 조정하는 것은 주로 앱 특정 기능이며 최소한 현재는 수동으로 수행하는 것이 가장 좋습니다.

2

모든 색인을 추가하면 일 수 있습니다.은 쿼리 속도를 높입니다. 은 업데이트, 삽입 및 삭제 속도를 감소시키고 디스크 공간 사용을 증가시킵니다.

DB Visualizer와 같은 도구를 사용하여 제어 기능을 유지하고 수행해야 할 사항을 평가하는 데 필요한 정보를 제공합니다. 나는 이 아니며은 일방적으로 최선의 것을 결정하는 DBMS를 원한다.

내 의견으로는, 지적인 실체가 데이터베이스 조정을 결정하는 것이 훨씬 낫다. DBMS는 원하는 모든 것을 제안 할 수 있지만 최종 결정은 DBA에게 맡겨야합니다.

데이터베이스 사용 패턴이 1 주일 동안 변경되면 어떻게됩니까? DBMS에서 색인을 생성하고 일주일 후에 그 색인을 삭제하기를 원하십니까? Skynet과 함께 관리 악몽 시나리오처럼 들릴 수도 있습니다 :-)

1

이것은 좋은 질문입니다. 데이터베이스는 데이터 사용 패턴을 기반으로 필요한 인덱스를 만들 수 있지만 이는 특정 쿼리가 처음 실행될 때 느려지고 시간이 지남에 따라 더 빨라진다는 것을 의미합니다.

 
ID  USERNAME 
--  -------- 

: 다음 사용자 이름이 자주 사용자를 조회하는 데 사용되는 예를 들어 이런 표가있는 경우. 시간이 지나면 데이터베이스가 쿼리의 50 %가이 작업을 수행했다는 것을 알 수 있습니다.이 경우 사용자 이름에 인덱스를 추가 할 수 있습니다.

그러나 이것이 아주 상세하게 구현되지 않은 이유는 단순히 킬러 기능이 아니기 때문입니다. 인덱스 추가는 DBA에 의해 비교적 적은 횟수로 수행되며, 이것을 자동화함으로써 (매우 큰 작업 임) 데이터베이스 벤더에게는 가치가 없을 것입니다. 자동 인덱스 및 쿼리 응답 시간과 결과 세트 크기를 사용하려면 모든 쿼리를 분석해야하므로 구현하기가 쉽지 않습니다.

관련 문제