0

この youtube チュートリアルはこちら

ビットマップ インデックスは、インデックスを作成するときに常にテーブル全体のレプリカを作成するようです。インデックスを作成し、各行に対して 0 または 1 を設定するため、理解が間違っていますか? その他の問題は、チュートリアルの終わりに向かって、ビットマップ インデックスは != 演算子で操作できないように見えることです。私はそれを考え 、索引付けのPOVから私には同じように思えます=!=

4

1 に答える 1

2

テーブル内のすべての行は、少なくとも 1 つの個別の値1に対して、単一ビット (つまり、0 または 1) で表されます。テーブル全体のレプリカと見なすことができるかどうかはわかりません。これは、すべてのデータが複製され、他の列のデータが明らかに存在しないことを意味するためです。ただし、すべての行が表されているため、テーブル全体のデータが含まれています (おそらく複数回、ビットがゼロに設定されている 1 回を除く)。

コンセプト ガイドでは、何が起こっているかを説明しています。

ビットマップ内の各ビットは、可能な ROWID に対応します。このビットが設定されている場合、対応する行 ID を持つ行にキー値が含まれます。マッピング関数はビット位置を実際の行 ID に変換するため、ビットマップ インデックスは B ツリー インデックスと同じ機能を提供しますが、異なる内部表現を使用します。

収納 構造 も解説。

それに加えて、これを 2 次元配列と考えると、各値に対してすべての行を表す必要がある理由が明確になります。ドキュメントのでは、各行の値は個別の値の 1 つによって表される必要があるため、配列の「列」は正確に 1 ビットを 1 に設定する必要があります。「列」を持つ方法はありません。 ' それはすべてゼロです - 列が null 可能nullである場合、配列内の別の値になり、テーブル内の null 列のインデックスではそのビットが 1 に設定されます - テーブル内の行の場合、そこには作成されませんすべての行が表示されているわけではありません。

すべてゼロの配列「列」を使用できますが、存在しない行に対してのみです。「ビットマップ内の各ビットは可能な行 ID に対応します」が、必ずしも実際の行に対応するわけではありません。rowidストレージの説明から、ビットマップがs の範囲に対して格納されrowid、その範囲の値が実際の行 (この表) を指していない可能性があることがわかります。

そして、それが不等式のテストを問題にしている理由です。配列の 1 つの「行」を見て、'M'ゼロに設定されている行のすべてが一致すると言うことはできません!= 'M'。これは、rowidそのビットが表すビットが実際にはテーブル内の行ではない可能性があるためです。ある意味では、ゼロに設定されたビットは明確なことを何も教えてくれません。ビットを 1 に設定するだけです。したがって、不等条件の場合、インデックス全体をチェックして、他の値に対して 1 である値を見つける必要があります。


1 - 論理的にはすべての行がすべての値に対して表されますが、ドキュメント内のデータ ストレージの例では、値ごとに異なるrowid範囲が示されています。すべてのビットがゼロである範囲のインデックス データを格納する意味はないと思います。少なくとも 1 つのビットが 1 である範囲に対してのみです。保存されているものの概念図を読みすぎている可能性があります。

于 2013-08-04T17:45:16.467 に答える