zoukankan      html  css  js  c++  java
  • Oracle数据库中的默认索引

     

    索引

    SQL性能中最强大和最容易被误解的地方。在这篇文章中,我们将探讨:

    • 索引的用途
    • 如何创建和选择索引类型
    • 讨论如何决定索引什么以及如何查看它是否有用。

    Why?

    数据库表可能会变大。惊人地,异常大。扫描数百万、数十亿或数万亿行数据,只返回两行或三行数据,这是一种巨大的浪费。索引可以帮助你避免这些浪费。

    索引将值存储在索引列中。对于每个值,包含它的行的位置。就像一本书后面的索引。这使您能够专注于您感兴趣的数据。

    当它们使您能够找到“一些”行时,它们是最有效的。因此,如果您有一个获取少量行的查询,那么您很可能希望它使用索引。你需要做的第一件事就是创建它!
     
     

    如何创建索引

    创建索引很容易。您所需要做的就是确定要索引的列并为其命名!

    可以在同一个索引中放置多个列。这就是所谓的复合索引。在索引中放置列的顺序对优化器是否使用它有很大影响。稍后我们将讨论它的来龙去脉。

    create index <index_name> on <table_name> ( <column1>, <column2>, … );

    但首先,让我们深入研究一下Oracle数据库中可用的不同类型的索引。

    如何选择索引类型

    Oracle数据库提供了许多不同类型的索引来改进SQL。您需要做出的一个关键决定是使用位图还是B-tree索引。

    默认情况下,索引是B-tree。这些都是平衡的。这意味着所有的叶节点都位于树中的相同深度。所以访问任何值的工作量(O(log n))是一样的。每个叶索引条目都指向一个行。

    位图是非常不同的。与 B-tree 一样,它们存储索引值。但是,数据库将每个值与一个rowid范围相关联,而不是每个条目对应一行。然后它有一系列的1和0来显示范围中的每一行是否有值(1)。

    Value Start Rowid End Rowid Bitmap
    VAL1  AAAA        ZZZZZ     001000000...
    VAL2  AAAA        ZZZZZ     110000000...
    VAL3  AAAA        ZZZZZ     000111100...
    ...

    注意,开始和结束rowid范围覆盖了表中的所有行。但是大型表可能必须将行分割成几个范围。所以每个索引值都有许多项。

    这带来了一个关键的区别,所有索引值为空的行不包括在b树中。但是它们在位图中!因此,优化器可以使用位图来回答查询如下:

    where indexed_column is null;
     
    位图的另一个好处是很容易压缩所有那些1和0。因此,位图索引通常小于相同的 B-tree 索引。但是如果数据频繁的插入就有问题了(不能并行-因为频繁插入数据对位图索引的性能影响太大了- 所以默认不是位图索引)
     
     

    ------------未完待续------------

  • 相关阅读:
    集合框架(三)
    集合框架(二)
    集合框架(一)
    第九章 持有你的对象
    UML类图
    用a标签设置锚点
    设计原则
    第八章 接口与内部类
    装配Bean
    第33条:用EnumMap代替序数索引
  • 原文地址:https://www.cnblogs.com/yjyyjy/p/12810519.html
Copyright © 2011-2022 走看看