位图索引是否创建原始表的副本?

时间:2013-08-04 15:55:44

标签: oracle oracle11g database-indexes

在此YouTube教程中here

似乎Bitmap索引在创建索引时总是会创建整个表的副本。因为它创建了索引并且对每一行都是,所以它放0或1.我的底层是否错误? 更重要的是,在本教程结束时,似乎位图索引无法在!=运算符上运行。 我认为=!=从索引的POV看起来与我相同。

1 个答案:

答案 0 :(得分:2)

表中的每一行都以单个位(即0或1)表示,至少有一个不同的值 1 。我不确定是否可以将其视为整个表的副本,因为这意味着所有数据都被复制,而其他列中的数据显然不存在。但它确实包含整个表的数据,因为每一行都被表示(可能是多次,除了一个,其中的位设置为零)。

concepts guide解释了发生了什么:

  

位图中的每个位对应一个可能的rowid。如果是的话   set,然后具有相应rowid的行包含键值。   映射函数将位位置转换为实际的rowid,因此   位图索引提供与B树索引相同的功能   虽然它使用不同的内部表示。

storage structure is also explained

再加上这一点,当你把它想象成一个二维数组时,为什么必须为每个值表示每一行更清楚。在文档中的example中,每行的值必须由其中一个不同的值表示,因此数组的“列”必须只有一位设置为1.没有办法有一个全为零的'列' - 如果列可以为空,那么null将是数组中的另一个值,表中的空列将在索引中将该位设置为1 - 对于行中的一行表,所以表示每一行都没有意义。

您可以拥有全部为零的数组“列”,但仅适用于不存在的行。 '位图中的每个位对应于一个可能的rowid',不一定对应于实际的行。从存储描述中可以看到,位图的存储范围为rowid s,该范围内的rowid值可能不指向实际行(在此表中)。

这就是使不平等测试成为问题的原因。你不能只看一下数组的一个'行',并说'M'行中设置为零的任何内容与!= 'M'匹配,因为该位代表的rowid可能不是实际上是表格中的一行。从某种意义上说,设置为零的位并不能告诉你任何确定的东西;只有一点设置为1。因此,对于不等式条件,必须检查整个索引以找到任何其他值为1的值。


1 - 逻辑上每个值都代表每个值,但文档中的示例数据存储显示不同值的不同rowid范围;我想没有必要为所有位都为零的范围存储索引数据,仅适用于至少有一位为1的范围。但是所有行仍然至少在一个索引条目中表示,在某处设置为1。我可能正在阅读他们存储内容的概念图片。