由Oracle索引来理解ArcSDE索引

这个题目有点怪怪的,意思就是一提到ArcSDE的性能问题,都会提到重建空间索引,本文就以Oracle的索引例子,来类比ArcSDE for Oracle的空间索引,如果能把oracle索引示例弄明白,那么对ArcSDE的索引问题应该非常好理解了。

在数据库系统中,索引是非常重要的一个对象,尤其是面对大型数据表时,索引能大大提高数据检索的速度。本节将介绍索引的原理及索引的使用。

索引在现实世界中最典型的例子莫过于字典检索了。用户在使用字典时,可以使用两种方式,一是逐页翻查,以获得需要查找的目标;二是根据字典的检索目录来获得目标所在的页数,然后直接在该页获得查找目标。毫无疑问,利用检索目录(索引)检索目标是更为高效的方式。

现有的主流数据库都提供了索引这一概念,Oracle也不例外。一旦在数据表的某列上建立了索引,Oracle将另辟新的空间,以存储该列上所有值与其记录的rowid的对应关系。当用户试图以索引列作为搜索条件时,Oracle将利用索引来获得相应的rowid,并捕获该记录。

select * from people where name = 'David'

当Oracle处理该查询语句时,将执行全表扫描。当搜索到第6条记录时,会发现该条记录符合搜索条件,并将该记录纳入结果集合。但是搜索并不会停止,因为Oracle并不知道在后面的记录中是否仍然存在符合条件的记录。直至搜索完整个表,Oracle才会返回最终的结果集合。

但是,如果预先在表people的name列上创建了一个索引,那么,搜索的顺序将完全不同。创建索引的语法如下所示:

create index idx_people_name on people(name) 

一旦索引创建,那么表中所有数据将按照字母表顺序进行分块处理,例如,以每5条记录作为一个数据块(当然,实际数据块将大得多)。分块后的数据结构如下图所示。

 

由Oracle索引来理解ArcSDE索引

 

说明:文中的Oracle索引是以字符串字段创建的索引,那么字符串字段是以字母表顺序进行分类的,当然了也可以使用数字、日期等,那么对ArcSDE for Oracle也是一样的,空间索引是格网,与该例子比较,无非是他们将按字母排序,五个五个的,那么ArcGIS是按照格网的范围,在该范围的包含相关的要素。

此时执行搜索语句select * from people where name = ‘David’;时,Oracle只会在第一个数据块中进行搜索,因为数据库知道,第二个数据库都是M以后的数据。当搜索到David之后,如果下一条记录的name列的值不是David,Oracle也将停止搜索,因为列中所有值都是按照字母表顺序进行排列的,所有的“David”位置肯定是相邻的。一旦搜索到“David”,Oracle会马上获得其对应的rowid,并根据rowid快速定位该记录。 
对于如下SQL语句,索引的作用会反映的更加清晰。

select * from people where name = 'Michael'

select * from people where name = 'Michael';

因为要搜索的条件为name列的值为“Michael”,所以,将会直接跳转到第二个数据块进行搜索,因为第二个数据块才是以M开头的数据。而且,当获得Michael的下一条记录为“Richard”时,将停止搜索,返回结果集合。

 

说明:ArcSDE数据在oracle中进行查询会执行下面的步骤: 
1)首先比较grid和查询范围,找出在查询范围内的所有grid。 
2)找出在这些grid内的所有要素。
3)将这些要素的外包络矩形和查询范围比较,找出所有在查询范围内以及和查询范围相交的要素。 

基本上可以类比。

相关推荐