2013-09-23 1 views
1

MS-SQL 2012에서 쿼리에서 항상 "삭제됨"BIT 필드를 사용하려면 색인을 생성하는 것이 좋습니다 (예 : SELECT xx FROM oo WHERE Deleted = 0)MS-SQL 2012 - 인덱싱 비트 필드

필드가 BIT인지 또는 성능 문제에 대한 자동 인덱스가 이미 제공되어 있습니까?

+0

복제본 [SQL Server의 비트 필드를 인덱싱해야합니까?] (http://stackoverflow.com/questions/231125/should-i-index-a-bit-field-in-sql-server) – Lamak

답변

1

1,0 비트 또는 일부 제한된 값으로 구성된 비트 필드를 인덱싱하면 실제로 해당 값과 일치하는 행 수가 줄어 듭니다. 적은 수의 레코드의 경우이 방법이 효과적 일지 모르지만 많은 수의 데이터의 경우 성능 향상에 도움이 될 수 있습니다.

가 0과 1의 숫자 사이에 큰 차이가 있으며, 당신이 작은를 검색하는 경우 당신은

비트 필드에 색인이 시나리오에서 정말 도움이 될 수있는 복합 색인의 일환으로 비트 열을 포함 할 수 있습니다 둘 중.

+0

필자의 경우 User 테이블에서 DELETED (비트) 필드가있는 곳은 무엇입니까? –

+0

삭제 된/삭제되지 않은 모든 레코드를 요청할 필요가 없을 것입니다. USER = X 및 Deleted = 0을 요청하면 독립 인덱스로는 쓸모 없지만 복합 인덱스로는 매우 중요합니다. – Steve

1

비트 필드를 인덱싱하는 것은 선택도가 너무 낮기 때문에 필수 조건 아래에서 꽤 쓸모가 없습니다. 큰 테이블의 인덱스 스캔은 테이블 스캔보다 좋지는 않습니다. 다른 조건이있는 경우 고려할 수있는 필터링 된 인덱스를 만드는 데 사용할 수 있습니다.

이 필드가 논리의 특성을 변경하여 항상 술어에서 고려해야 할 경우보고 할 때 데이터를 다른 테이블로 분할하는 것을 고려할 수 있습니다.

+0

흥미로운 개념 ... 그래서 사용자 테이블의 "삭제 된"필드에 대해 제안 하시겠습니까? –

+0

메인 'Users' 테이블은 여전히 ​​필드를 가지지 만,'ActiveUsers '테이블도 유지합니다. 이것은 일반적으로 키에 의한'Users' 테이블에 대한 참조 일뿐입니다. 작은 테이블의 경우, 이것은 불필요 할 것입니다. 사용자가 이것이 필요하지 않다고 가정 할 수 있다는 것을 알고 있다는 사실을 기억하십시오. – ngneema

1

비트 필드를 인덱싱할지 여부는이 질문에 대한 대답에서 적절하게 설명 된 몇 가지 요인에 따라 다릅니다. Link to 231125

0

다른 언급과 마찬가지로 선택도가 핵심입니다. 그러나 항상 하나의 값 또는 다른 값으로 검색하고 값이 매우 높은 경우이 필터링 된 인덱스를 사용하는 것이 좋습니다.

0

클러스터 된 인덱스 앞에 놓지 않으시겠습니까? 삭제가 증분 일 경우 채우기 비율을 낮추어야하지만 일상적 일 것입니다. 맞습니까? 삭제되지 않은 레코드보다 삭제 된 레코드가 더 길었습니까? 그리고 말했듯이 삭제되지 않은 레코드 만 쿼리합니다. 그래, 네. 해당 열의 색인을 생성하지 마십시오. 그것에 클러스터.

0

비트 열이 인덱스의 첫 번째 위치에있을 때이 인덱스는 합성 인덱스의 일부로 유용 할 수 있습니다. 하지만 다음 필터를 another_key에 인덱스를 생성 (= 1 another_key =?; 삭제 결코 = 0 삭제 곳 .... 선택) 만 selectitn 한 값을 사용한다고 가정하면 :

create index i_another on t(another_key) where deleted=1 

경우] 비트 열은 복합 인덱스의 마지막이어야하며 인덱스의 경우는 쓸모가 없습니다. 그러나 더 나은 수행을 위해 그것을 포함시킬 수 있습니다 :

create index i_another on t(another_key) include(deleted) 

그런 다음 DB 엔진은 읽기 색인과 함께 값을 가져오고 기본 테이블 페이지에서 값을 가져올 필요가 없습니다.