B-Tree与Bitmap数据库索引

时间:2012-03-02 22:57:31

标签: sql database oracle

有人可以解释位图和b树索引之间的差异。在什么情况下你会使用这两种?每种方法的优点/缺点是什么?

2 个答案:

答案 0 :(得分:25)

来自维基百科:B-Treesbitmap indexes。用例:

  • B-Trees是在数据库中执行CREATE INDEX ...时使用的典型索引类型:

    1. 当您只选择索引数据的一小部分时(通常最多5%-10%),它们非常快。
    2. 当您拥有大量不同的索引值时,它们的效果会更好。
    3. 可以组合多个B-Tree索引,但更简单的方法通常更有效。
    4. 如果索引数据的值不同,或者您希望获得较大(通常为10%)的数据子集,则它们无效。
    5. 在索引表上插入/更新值时,每个B-Tree索引都会产生一个小的惩罚。如果在非常繁忙的表中有很多索引,这可能会成为一个问题。
    6. 这种特性使得B-Tree索引对于加速OLTP应用程序中的搜索非常有用,当您一次处理非常小的数据集时,大多数查询按ID过滤,并且您希望获得良好的并发性能。 / p>

    7. 位图索引是一种更专业的索引变体:

      1. 他们将索引值编码为位图,因此非常节省空间。
      2. 当没有明显的索引值时,它们往往会更好地工作
      3. 数据库优化器可以非常轻松地组合多个位图索引,这样可以在查询中高效执行复杂的过滤器。
      4. 插入/更新值时效率非常低。

      5. 位图索引主要用于数据仓库应用程序,其中除了ETL进程外,数据库是只读的,您通常需要针对star schema执行复杂查询,其中位图索引可以加速根据维度表中的条件进行过滤,这些条件通常没有太多不同的值。

作为一个非常简短的摘要:使用B-Tree索引(大多数数据库中的“默认”索引),除非您是数据仓库开发人员并且知道您将受益于位图索引。

答案 1 :(得分:0)

使用常规BTree索引时,所有列值均为空的行将从索引中排除。这意味着具有“列为空”条件的查询将不会从普通索引中受益。

现在,通过在(column_name,1)(或其他常数)上创建索引,可以将空值列包含在其中,从而使优化程序在执行“ is null”查询时可以使用该查询。

与B * Tree索引不同,位图索引自动包含空值。这意味着优化器可以在评估“ is null”谓词时使用位图索引。

位图索引可能会导致并发问题,可能会阻止同一表上的其他DML。因此,在OLTP应用中应避免这些情况。位图索引也需要企业版,因此​​使用这些索引可能会涉及许可问题。