
2.1 存储索引工作原理
存储索引是Exadata存储管理软件中非常强大的一个特性,有助于避免存储节点的IO扫描操作。Exadata存储管理软件会在存储服务器的内存中创建和维护一个存储索引。存储索引的维护工作对用户而言都是透明的,无需用户的参与。
存储服务器上存放的数据被逻辑地分成若干小的分区,每个分区大小为1MB。这些小分区称为Storage Region。存储管理软件将每个Storage Region中存储的物理对象的某一列或多个列的最小值和最大值保存在内存中,每一个Storage Region在内存中保存的最小值和最大值的信息条目叫作Region Index,若干条这样的内存Region Index条目统称为存储索引。
存储索引与传统数据库中的索引是完全不同的两种概念,主要体现在如下几点。
(1)传统数据库中的索引是在物理上真实存在的,有物理地址可以直接定位到磁盘位置;而存储索引不是物理存在的,它没有物理块地址,它只是存储节点内存中的一片区域,临时地存放一些统计信息。
(2)传统数据库中的索引的作用是为了快速定位需要访问的数据块;而存储索引的作用是尽量减少数据发生物理IO扫描的区域。
(3)存储节点重启不会导致传统数据库中的索引丢失;而存储节点重启会导致存储索引丢失,因为它只是临时存放在内存区域的一些统计信息而已。
存储索引的作用类似于传统Oracle数据库中的“分区”(Partition),都是减少需要访问的数据量,减少存储服务器上的物理IO扫描。
注意:只有在智能扫描的前提下,才有可能利用上存储索引特性,所以并不是所有的应用系统都能利用上存储索引特性。只有那些数据仓库性质的,同时带有谓词查询条件过滤的SQL语句才会从存储索引特性中获益,而那些OLTP的业务系统基本上不会进行智能扫描操作,也就基本上无法利用存储索引特性了。
存储索引的工作原理如图2.1所示。

图2.1 存储索引工作原理
在图2.1中,对于每一个ASM磁盘上的存储空间,逻辑上将每1MB大小的区域称为一个Storage Region。假设T1表占用了2个Storage Region空间,T2表占用了1个Storage Region空间。当第一次访问T1表的B字段时,存储节点会自动地在内存中维护T1这张表的Region Index。从Region Index部分可以看出,B:1/5也即这1MB的物理区域中,T1表的B字段最小值为1,最大值为3;B:3/8也即这1MB的物理区域中,T1表的B字段最小值为3,最大值为8。当再次访问T1表,同时B字段作为过滤条件时(如SQL语句:SELECT∗FROM T1 WHERE B<2;),则会先搜索存储节点内存中存储索引中的Region Index条目。当发现第一个Storage Region空间包含需要访问的数据,而第二个Storage Region空间不包含需要访问的数据时,则只会物理扫描第一个Storage Region空间,而跳过第二个Storage Region空间。
注意:无论SQL语句是否使用智能扫描,数据库节点都要求存储节点实际扫描所请求的数据块,而只有使用了智能扫描,同时存储索引生效时,才会真正减少存储节点实际扫描的数据块数量,这样才会真正地减少物理IO的使用率,同样也意味着更快的处理速度和更快的IO响应时间。