2012-05-09 4 views
2

행의 특정 하위 집합이 읽기에 훨씬 더 많은 테이블이 있다고 가정 해 보겠습니다. people 테이블에 is_alive 플래그가있는 것과 같습니다. 또는 소프트/논리적 삭제를 구현하는 경우 검색 기준에 항상 is_deleted = 0이 포함됩니다.하위 카디널리티 플래그를 인덱싱해야합니까?

이러한 필드는 이러한 테이블의 색인에 포함되어야합니까? 그렇다면, 그들은 더 왼쪽 또는 더 오른쪽해야합니까?

자신이하지 않는 낮은 카디널리티/의미가

people [ last_name ] 
people [ zip_code ] 
people [ gender ] 

widgets [ category_id ] 
widgets [ seller_id ] 

는 당신이 그 (것)들을

people [ last_name, is_alive ] 
widgets [ category_id, is_valid ] 

또는

people [ is_alive, last_name ] 
widgets [ is_valid, category_id ] 

부울처럼 보이게 마 ...의 당신이 같은 인덱스가 있다고 가정 해 봅시다 그들은 다른 검색 기준과 쌍을 이룹니다.

거의 항상 매번 사용되지만 모든 색인에이 필드를 추가하는 것만으로도 기분이 상쾌합니다. 어쩌면 그 자체가 "문제"입니까? 행이 동일한 스키마가있는 다른 테이블로 셔틀해야합니까? 기본적으로 플래그를 분할합니다.

벤더 무신론자.

+2

'performance'와'Vendor Agnostic'을 함께 사용하지 마십시오. ** EVER ** for SQL. 얼마나 효율적인가는 해당 공급 업체의 구현에 100 % 의존합니다. – JNK

+0

+1 @JNK ... SQL Server에 대한이 질문에 대한 대답을 드릴 수는 있지만 대답은 SQL Server에만 해당됩니다. –

+0

@JNK 지점을 찍었지만 이론/규칙을 더 찾고있었습니다. 사례별로 적용 할 수있는 엄지 손가락 –

답변

0

일부 RBDMSs도 당신은 SQL 서버 2000 비트 필드에 인덱스 ... 공급 업체 비록 무신론자해야

뭔가를 배치 못하게 ... 보통 인덱스의 선택이다 그 그것의 유용성을 결정합니다.

인덱스가 is_alive이고 스플릿이 50 % 활성/50 % 죽은 경우 해당 인덱스는 유용 할 정도로 선택되지 않습니다.

그러나 분할이 살아있는 비율이 99 %, 사망률이 1 % 인 경우 ... 죽은 사람을 검색 할 때 색인을 사용할 수 있지만 살아있는 사람을 검색 할 때는 색인을 무시할 수 있습니다. 분야 에 대한 특정 값을 가지고 적은 비율의 행이 있는지

그래서 인덱스 유용 할 수 있습니다 당신은 인덱스 유지 관리의 오버 헤드를 정당화하기 위해 특정 값을 가진 행을 자주 충분히 검색 할 수 있습니다.

그러나 이것은 사용하는 RDBMS에 전적으로 의존하므로 특정 RDBMS에 대한 성능 관련 디자인 고려 사항을 테스트해야합니다.

0

인덱스가 전체 테이블 스캔을 위해 읽어야하는 페이지 수를 줄임으로써 쿼리를 돕는 주요 방법 중 하나입니다. 데이터베이스 엔진은 레코드를 저장하는 페이지를 관리한다는 것을 기억하십시오. 고객 표가 있고 상태에 대한 색인이 있다고 가정 해보십시오. 단일 상태로만 필터하는 쿼리는 데이터의 작은 부분을 읽어야합니다. 물론 비율은 작은 주에서는 10 % (캘리포니아의 경우) 대 1 % 미만일 수 있습니다. 문제는이 데이터를 읽는 데 필요한 페이지의 수입니다.

이 질문에 대답하려면 정보가 필요합니다. (1) 쿼리가 얼마나 선택적입니까? (2) 한 페이지에 몇 개의 레코드가 들어 있는가? 따라서 100 개의 레코드가 페이지에 들어 맞으면 2 %의 행을 선택하는 쿼리는 거의 항상 모든 페이지를 읽어야합니다. 이 경우 인덱스는 전체 테이블 스캔을 지원하지 않습니다.색인은 차례대로 오버 헤드가 발생하므로 사용하지 않아야합니다.

반면에 페이지에 레코드가 1 개인 경우 2 %의 행을 선택하는 쿼리는 페이지의 2 % 만 읽으면됩니다 (50X의 비용 절감). 색인에 의해 발생되는 거의 모든 오버 헤드가 그만한 가치가 있습니다.

인덱스는 여러 목적으로 사용되기 때문에 서로 다른 데이터베이스 엔진이 다르게 구현하기 때문에 페이지 테이블이 다르게 구현되므로 더 빠르고 엄격한 규칙이 적용되지 않습니다. 그러나 일반적으로 낮은 카디널리티 플래그는 인덱스의 후보가 아닐 수 있습니다.

제가 생각하기에 인덱스가 효율적일 수있는 사례를 생각해 볼 수 있습니다. 이는 넓은 행과 인덱스에서만 처리 할 수있는 쿼리 (select 플래그, 플래그에 의한 테이블 그룹의 count (*))입니다.

그런데 이와 같은 플래그가 여러 개인 경우 합성 색인이 성능을 쿼리하는 데 도움이 될 수 있습니다.

관련 문제