yjyyjy

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
 

 

索引

 

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 索引。但是如果数据频繁的插入就有问题了(不能并行-因为频繁插入数据对位图索引的性能影响太大了- 所以默认不是位图索引)
 
 

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

posted on 2020-04-30 19:24  闭关49天  阅读(1842)  评论(0编辑  收藏  举报