2009-03-18 2 views
1

좋은 날,여러 비트 열에서 인덱스를 만드는 가장 좋은 방법은 무엇입니까?

SQL Server 2005에서 몇 가지 부울 (비트) 열을 포함하여 여러 개의 열이 있습니다. 예를 들어 테이블 'Person'에는 열 ID와 열 HasItem1, HasItem2, HasItem3, HasItem4가 있습니다. 이 테이블은 다소 크므로 빠른 검색 결과를 얻기 위해 인덱스를 만들고 싶습니다.

비트 열에 인덱스를 만드는 것이 좋지 않다는 것을 알고 있으므로 모든 비트 열과 함께 인덱스를 사용하는 방법을 생각했습니다. 그러나, 모든 비트 열이 쿼리에 있거나 없을 수 있습니다. 인덱싱 된 열의 순서는 인덱스에서 중요하며 어떤 인덱스가 쿼리에서 사용될 지 모르기 때문에 어떻게 처리해야합니까?

현재, 이미 제거 할 수없는 클러스터 된 인덱스가 있습니다.

답변

0

확율은 SQL 다음은 항목 1, 항목 2, ... 항목 N으로 하나의 테이블을 검색 할 수있을 것입니다 person_id로와 ITEM_ID 및 BitValue와 큰 테이블을 조회하는 것이 쉬울 것입니다.

2

나는 이것이 아마도 좋은 생각이 아닐 것이라고 제안합니다. 카디널리티가 매우 낮은 필드를 인덱싱하려고하면 일반적으로 쿼리 속도가 빨라지 지 않으므로 인덱스 유지 관리 오버 헤드가 발생합니다.

일반적으로 비트 필드 중 하나를 다른 필드로 검색하는 경우 두 필드의 복합 인덱스가 도움이됩니다.

비트 필드에 복합 색인을 작성하는 경우 색인 시작 부분의 복합 필드가 제공된 경우에만 도움이됩니다. 복합 색인에 첫 번째 값을 포함시키지 않으면 색인이 전혀 사용되지 않을 것입니다.

검색어의 90 %에서 bita를 사용하고 70 %에서 bitd를 사용하고 20 %에서 b와 c를 사용하면 (bita, bitd, bitb, bitc)의 복합 색인이 하지만 쿼리의 최소 10 %는 가능하고 40 %는 인덱스를 사용하지 않을 가능성이 높습니다.

동일한 데이터 볼륨 및 데이터 카디널리티로 시도하고 실행 계획에서 말하는 내용을 참조하는 것이 가장 좋습니다.

2

SQL 서버에 대한 자세한 내용은 잘 모릅니다. 그러나 일반적으로 고유하지 않은 데이터가있는 열을 인덱싱하는 것은 그리 효과적이지 않습니다. 일부 RDBMS 시스템에서는 옵티마이 저가 어쨌든 고유 한 비율보다 작은 인덱스를 무시하므로 인덱스도 존재하지 않을 수 있습니다.

복합 또는 다중 열 색인을 사용하면 도움이 될 수 있지만 필터 제약 조건이 색인이 작성된 순서와 동일한 순서 인 경우에만 특히 유용합니다. 색인에 'field1, field2'가 포함되어 있고 검색 중 'field2, field1'또는 일부 다른 조합의 경우 색인을 사용할 수 없습니다. 최적화하려는 특정 검색 케이스 각각에 대해 색인을 추가 할 수 있습니다. 즉, 내가 생각할 수있는 모든 것을 할 수 있습니다. 그리고 모든 비트 필드를 고려한 후에도 데이터가 매우 독특하지 않은 경우에도 색인은 무시 될 수 있습니다.

예를 들어 3 비트 필드가있는 경우 데이터를 8 개의 개별 그룹으로 만 나눕니다. 표에 적당한 수의 행이있는 경우이를 8로 세분하는 것이 효과적이지는 않습니다.

0

2005 년에 대해서는 모르지만 SQL Server 2000 (온라인 설명서에서) : "형식 비트의 열은 인덱스를 가질 수 없습니다."

0

체크섬 사용은 어떻습니까?

은 테이블에 INT 필드 이름 mysum을 추가하고이

UPDATE checksumtest SET mysum = CHECKSUM(hasitem1,hasitem2,hasitem3,hasitem4) 

지금 당신이 비트의 조합을 나타내는 값을 실행합니다.

검색 쿼리에서 동일한 체크섬 계산을 수행하고 마이섬에서 일치시킵니다.

이렇게하면 작업 속도가 빨라질 수 있습니다.

+0

비트 필드에서 체크섬을 수행하는 것은 색인을 생성하는 것과 동일한 제한 사항을 갖습니다. 4 비트 필드를 체크섬하여 생성되는 16 개의 고유 한 값만 가질 수 있으므로 고유성은 낮습니다. – dnewcome

+0

확실하지만 지금은 하나의 필드 만 검색 중입니까? – Sam

0

데이터베이스 디자인을 다시 방문해야합니다. 필드 HasItem1에 HasItem #이있는 테이블을 갖는 대신 브리지 엔티티를 만들고 필드가없는 경우 마스터 항목 테이블을 만들어야합니다. 브리지 엔티티 (테이블) 인 person_items는 최소한 두 개의 필드, 즉 person_id and item_ ID를가집니다.

데이터베이스를 이런 식으로 디자인해도 열 정의를 기반으로하는 항목 수가 N 인 데이터베이스에만 고정됩니다. 마스터 항목 테이블에 원하는만큼 항목을 추가하고 필요한만큼 많은 항목을 연결할 수 있습니다.