索引
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;
------------未完待续------------