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