2012-08-17 3 views
1

나는 정기적으로 쿼리 SELECT * from table WHERE somefield = 20을 수행하는 테이블 (잠재적으로 커질 수 있으며 수백만 개의 행이 커질 수 있음)을 가지고 있으며이 쿼리를 빠르게 실행하고 싶습니다. 언제든지이 쿼리는 다른 값에 대한 보장이없는 특정 값 20에 대해 최대 10 개의 행을 반환 할 것으로 기대합니다. 이것을 색인화하는 적절한 방법은 무엇입니까? 일부 필드에 색인을 작성하고 통계가 대략 최신인지 확인하는 것으로 충분합니까? 아니면 이것을 최적화 할 수있는 다른 트릭이 있습니까?특정 조회에 대해 최적화 된 인덱스

+0

나는 내가 찾던 정확히 보인다,이 – cjk

+0

이 – Martijn

답변

1

분리에서이 쿼리 위한 이상적인 인덱스 키 열 somefield와 인덱스 될 테이블에있는 다른 모든 컬럼의 열을 포함 할 (중 클러스터 된 인덱스 또는 INCLUDE 옵션으로 NCI을함으로써).

이렇게하면 값을 직접 찾아보고 책갈피 조회가 필요하지 않게됩니다.

그러나 데이터 수정 작업에 영향을 미치는 모든 포괄 열이있는 NCI의 유지 관리 오버 헤드 당신은 CI를 선호하는 것은 그 이유를 당신을 위해 이렇게 분열에게 어쨌든

를 다른 쿼리 혜택을하거나 피하기 위해 다른 키 열을 정의 할 수 somefield에만 NCI를 정의하고 10 개의 북마크 조회를 사용하는 것이 좋습니다. 그것은 균형 잡힌 행동입니다.

편집. 실제로 인 경우 과 같은 값으로 filtered index을 만들면 쿼리 최적화에 관심이있는 사람은입니다. 그러면 해당 인덱스 정의의 모든 열 include 것 같습니다.

+0

필터링 된 인덱스를 이동하는 것이 합리적 소리 dba.stackexchange.com로 이동하는 투표를했습니다 – Martijn

1

인덱스를 일부 필드에두면 충분하며 통계가 대략 최신인지 확인하십시오.

네, 아주 간단합니다. somefield가 올바른 타입인지 확인하십시오 (즉 int). somefield가 텍스트를 포함 할 필요가 있다면 더 할 수 있지만 그렇지 않으면 정상적인 인덱스가 좋을 것입니다.

당신은 작은 증가를 얻을 수있다 (그리고 나는 작은 뜻) 당신이 (당신이 이미 그것이 무엇인지 당신이, 아마도, somefield 필요가 없습니다) SELECT *를 사용하지 의해 반환 된 모든 필드가 필요하지 않은 경우.

0

예, 일부 필드에 색인을 추가하려고합니다.

다른 쿼리를 수행하지 않는 경우 클러스터 된 인덱스로 만들 수 있지만 컨텍스트가 없으면 결론적으로 말하기 어렵습니다.

관련 문제