비트 맵 인덱스는 인덱스를 만들 때 항상 전체 테이블의 복제본을 만듭니다. 인덱스를 만들고 각 행에 대해 만들기 때문에 0 또는 1이됩니다. 내 understadning이 잘못 되었습니까? otehr 문제는 튜토리얼이 끝날 무렵 비트 맵 인덱스가! = 연산자에서 작동하지 않는다는 것입니다. =
과 !=
은 색인 생성의 POV에서 나와 동일하게 보인다고 생각했습니다.
답변
적어도 하나의 고유 값 에 대해 테이블의 모든 행이 단일 비트 (즉, 0 또는 1)로 표현됩니다. 모든 데이터가 복제되고 다른 열의 데이터가 분명히 존재하지 않는다는 것을 의미하므로 전체 테이블의 복제본으로 간주 할 수 있는지 확신 할 수 없습니다. 그러나 모든 행이 표현되기 때문에 전체 테이블에 대한 데이터를 포함합니다 (비트가 0으로 설정된 하나를 제외하고 여러 번 나타남).
concepts guide는 무슨 일이 일어나고 있는지 설명 : 비트 맵의
각 비트는 가능한 ROWID에 해당합니다. 비트가 이면, 해당 rowid가있는 행은 키 값을 포함합니다. 매핑 기능은 비트 위치를 실제 rowid로 변환하므로 비트 맵 인덱스는 다른 내부 표현을 사용하지만 B 트리 인덱스 과 동일한 기능을 제공합니다.
storage structure is also explained.
2 차원 배열로 생각하면 왜 각 행마다 모든 행을 표시해야하는지 명확 해집니다. 설명서의 example에서 각 행의 값은 별개의 값 중 하나로 표시되어야하므로 배열의 '열'은 정확히 1 비트를 1로 설정해야합니다. '열 '이 모두 0입니다 - 열이 nullable 인 경우 null
은 배열의 다른 값이되고 테이블의 null 열은 해당 비트가 인덱스에서 1로 설정됩니다. 테이블의 행에 대해서는 그렇지 않습니다. 모든 행을 표현한 이 아니고이 아님을 의미합니다.
배열 'column'은 모두 0이지만 존재하지 않는 행에 대해서만 사용할 수 있습니다. '비트 맵의 각 비트는 가능한 행 ID에 해당합니다. 반드시 실제 행과 다를 필요는 없습니다. 저장소 설명에서 비트 맵은 rowid
초 범위에 저장되며이 범위의 rowid
값은이 테이블의 실제 행을 가리 키지 않을 수 있습니다.
그리고 이것이 불평등 테스트가 문제를 일으키는 이유입니다. 배열의 '행'을보고 0으로 설정된 'M'
행의 모든 항목이 != 'M'
과 일치한다고 말할 수는 없습니다. rowid
이 나타내는 비트가 실제로 테이블의 행이 아닐 수도 있기 때문입니다. 어떤 의미에서 0으로 설정된 비트는 당신에게 명확한 것을 말하지 않습니다; 단지 1로 설정된 비트는 않습니다. 따라서 불평등 조건의 경우 전체 인덱스를 검사하여 다른 값에 대해 1 인 값을 찾아야합니다.
1 - 논리적으로 각 행마다 값을 표현하지만, 문서의 예시적인 데이터 저장소는 다른 값의 다른 rowid
범위를 나타낸다 적어도 하나의 비트가 1 인 범위에 대해서만 모든 비트가 0 인 범위에 대한 인덱스 데이터를 저장하는 지점은 없다고 생각합니다. 그러나 모든 행은 적어도 1 개의 인덱스 항목에서 여전히 1로 설정된 비트로 표시됩니다. 저장된 내용에 대한 개념적 그림을 너무 많이 읽었을 수 있습니다.