2011-09-02 6 views
3

나는 수백 ~ 수천 개가 부울 필드 (값 대신 0이 아닌)로 표시되는 거대한 테이블 (수백만 개의 레코드)이 있습니다.하나의 값만 포함하는 데이터베이스 인덱스

사실 (값 = 1) 인 레코드 만 관리합니다. 이 레코드 만 '인덱스'하는 인덱스를 만드는 방법이 있습니까? 어떤 종류의 색인을 사용해야합니까?

select count(*) 
from records 
where boolean_field = 1 

환경 : 오라클 10g

감사합니다 (그러나 나는 또한 다른 DBMS에 대한 의견에 관심이 있어요)!

답변

4

"false"값을 0이 아닌 null로 만들 수 있다면 원하는 결과를 얻을 수 있습니다.

create index idx on recors (case boolean_field when 1 then 1 end); 

하지만 오라클은 쿼리에서 사용하는 경우에만 인덱스 1 초는 당신의 쿼리처럼해야 할 것 같습니다 :

그렇지 않으면, 당신은이 같은 함수 기반 인덱스를 만들 수 있습니다

select * from records where case boolean_field when 1 then 1 end = 1; 
+1

함수 기반 인덱스 경로를 가고, 내가 구운 케이스 로직과 뷰를 만드는 제안 대신 테이블의 볼 수있는 모든 쿼리를했을 경우. 이렇게하면 테이블에 대해 쿼리를 작성하는 모든 사용자가 인덱스를 활용할 수 있습니다. – Craig

+0

나는 두 가지 변종을 좀 싫어하지만, 나는 첫 번째 변신으로 가겠다! 당신의 도움을 주셔서 감사합니다! – reto

1

오라클의 비트 맵 인덱스와 같은 일반적인 경우입니다.

create bitmap index bool_field_index on recors(boolean_field) 

http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_5010.htm#i2062403

+1

비트 맵 인덱스는 DML에 많은 비용을 부과하여 OLTP 시스템에 부적합하게 만듭니다. 그리고 요즘 데이터웨어 하우스조차도 일괄 처리 모드가 아닌 실시간으로 거의 업데이트 될 수 있습니다. 비트 맵 인덱스가 실행 가능한 솔루션이 아니라는 것을 의미하지는 않습니다. 특정 상황에서만 도움이 될 것입니다. – APC

관련 문제