【发布时间】:2013-08-04 15:55:44
【问题描述】:
在这个 youtube 教程中here
似乎位图索引在创建索引时总是会创建整个表的副本。因为它创建索引并针对每一行,它放置 0 或 1。我的理解错了吗?
其他的事情是,在本教程结束时,位图索引似乎无法对 != 运算符进行操作。
从索引的 POV 来看,我认为 = 和 != 对我来说似乎相同。
【问题讨论】:
标签: oracle oracle11g database-indexes
在这个 youtube 教程中here
似乎位图索引在创建索引时总是会创建整个表的副本。因为它创建索引并针对每一行,它放置 0 或 1。我的理解错了吗?
其他的事情是,在本教程结束时,位图索引似乎无法对 != 运算符进行操作。
从索引的 POV 来看,我认为 = 和 != 对我来说似乎相同。
【问题讨论】:
标签: oracle oracle11g database-indexes
表中的每一行都用一个位(即 0 或 1)表示,至少有一个不同的值1。我不确定是否可以将其视为整个表的副本,因为这意味着所有数据都已复制,而其他列中的数据显然不存在。但它确实包含整个表的数据,因为每一行都被表示(可能多次,除了一个位设置为零之外的所有行)。
concepts guide 解释了正在发生的事情:
位图中的每个位都对应一个可能的 rowid。如果位是 设置,则对应rowid的行包含键值。 映射函数将位位置转换为实际的 rowid,因此 位图索引提供与 B 树索引相同的功能 尽管它使用不同的内部表示。
storage structure is also explained。
加上这一点,当您将其视为二维数组时,为什么必须为每个值表示每一行就变得更清楚了。在文档中的example 中,每一行的值必须由不同的值之一表示,因此数组的“列”必须恰好有一个位设置为 1。没有办法让'column' 全为零 - 如果该列可以为空,那么 null 将是数组中的另一个值,并且表中的空列将在索引中将该位设置为 1 - 对于表中的一行,所以有不代表每一行是没有意义的。
您可以拥有一个全为零的数组“列”,但仅限于不存在的行。 '位图中的每一位都对应一个可能的 rowid',不一定是实际的行。从存储描述中您可以看到,位图是根据rowids 的范围存储的,并且该范围内的rowid 值可能不指向实际的行(在此表中)。
这就是测试不等式成为问题的原因。您不能只查看数组的一个“行”并说'M' 行中设置为零的任何内容都与!= 'M' 匹配,因为该位表示的rowid 实际上可能不是表。从某种意义上说,将位设置为零并不能告诉您任何确定的信息。只有一点设置为 1。因此,对于不等式条件,必须检查整个索引以找到任何其他值都为 1 的值。
1 - 从逻辑上讲,每一行都代表每个值,但文档中的示例数据存储显示不同值的不同 rowid 范围;我想对于所有位都为零的范围存储索引数据是没有意义的,仅适用于至少一位为 1 的范围。但是所有行仍然在至少一个索引条目中表示,作为某处设置为 1 的位。我可能对他们存储的概念图了解太多了。
【讨论】: