这里我们首先看一下ArcSDE的索引类型ST_SPATIAL_INDEX的定义:
CREATE OR REPLACE INDEXTYPE "SDE"."ST_SPATIAL_INDEX" FOR
"SDE"."ST_CONTAINS" ("SDE"."ST_GEOMETRY", "SDE"."ST_GEOMETRY"),
"SDE"."ST_CROSSES" ("SDE"."ST_GEOMETRY", "SDE"."ST_GEOMETRY"),
"SDE"."ST_ENVINTERSECTS" ("SDE"."ST_GEOMETRY", NUMBER, NUMBER, NUMBER, NUMBER),
"SDE"."ST_ENVINTERSECTS" ("SDE"."ST_GEOMETRY", "SDE"."ST_GEOMETRY"),
"SDE"."ST_EQUALS" ("SDE"."ST_GEOMETRY", "SDE"."ST_GEOMETRY"),
"SDE"."ST_INTERSECTS" ("SDE"."ST_GEOMETRY", "SDE"."ST_GEOMETRY"),
"SDE"."ST_ORDERINGEQUALS" ("SDE"."ST_GEOMETRY", "SDE"."ST_GEOMETRY"),
"SDE"."ST_OVERLAPS" ("SDE"."ST_GEOMETRY", "SDE"."ST_GEOMETRY"),
"SDE"."ST_RELATE" ("SDE"."ST_GEOMETRY", "SDE"."ST_GEOMETRY", VARCHAR2),
"SDE"."ST_TOUCHES" ("SDE"."ST_GEOMETRY", "SDE"."ST_GEOMETRY"),
"SDE"."ST_WITHIN" ("SDE"."ST_GEOMETRY", "SDE"."ST_GEOMETRY")
USING "SDE"."ST_DOMAIN_METHODS"
WITH LOCAL RANGE PARTITION
我们知道ESRI的ST_GEOMETRY类型是符合OGC规范的几何类型,上述定义中所有基于ST_GEOMETRY的空间关系操作也都符合OGC规范;除了OGC规范,ArcSDE中还包括诸如ST_ENVINTERSECTS这样非常有用的操作。数据库在执行所有这些操作的时候,都会判断是否应该使用索引来加快查询。
ArcSDE在不同的数据库中使用不同的索引算法,比如在PostgreSQL和Informix中使用的是R树索引;而Oracle和DB2中使用的是格网索引。我们现在的环境是Oracle,因此这里的空间索引就是格网索引。
如果打开ArcCatalog,打开一个Feature Class的属性对话框可以看到这样的内容:
图 8 ArcCatalog中Feature Class的空间索引属性
这里的3个“Grid ”属性对应的就是不同级别的网格的尺寸。在ArcSDE中最多可以对空间数据创建3级格网索引,每一级索引都有相应的网格尺寸:第1级索引的网格最小,第2级的网格必须是第1级大小的3倍以上,第3级网格也必须是第2级大小的三倍以上。当然,不少情况下使用1级索引就够了,那这时2级索引和3级索引的网格大小就是0。
比如上面在ArcCatalog中查看过的名为“CITIES”的Feature Class,如果查看一下它的空间索引定义是这样的:
CREATE INDEX "SDE"."A3_IX1" ON "SDE"."CITIES" ("SHAPE")
INDEXTYPE IS "SDE"."ST_SPATIAL_INDEX" PARAMETERS ('ST_GRIDS = 4.314434698311 ST_SRID = 2 ST_COMMIT_ROWS = 10000 PCTFREE 0 INITRANS 4')
从这个定义可以知道,我们在这个空间表上创建了1级空间索引A3_IX1,空间索引的网格大小约为4.3,因为这是一个世界城市的分布,其数据分布在X方向约-180到180、Y方向约-60到80的范围内,因此这个数据集大概会被分为80×30的格网。
这个索引对应的索引组织表名叫S3_IDX$,在这个表里存放了所有几何对象的索引数据,查看一下相关的信息:
SQL> desc S3_IDX$
名称 是否为空? 类型
----------------------------------------------------------------- -------- --------------------------------------------
GX NOT NULL NUMBER(38)
GY NOT NULL NUMBER(38)
MINX NOT NULL NUMBER(38)
MINY NOT NULL NUMBER(38)
MAXX NOT NULL NUMBER(38)
MAXY NOT NULL NUMBER(38)
SP_ID NOT NULL ROWID
SQL> select count(*) from S3_IDX$;
COUNT(*)
----------
2539
已用时间: 00: 00: 00.01
SQL> select * from S3_IDX$ where rownum<10;
GX GY MINX MINY MAXX MAXY SP_ID
---------- ---------- ---------- ---------- ---------- ---------- ------------------
75 103 3.2435E+11 4.4537E+11 3.2435E+11 4.4537E+11 AAASkyAAFAAAB7SAAM
75 103 3.2635E+11 4.4554E+11 3.2635E+11 4.4554E+11 AAASkyAAFAAAB7SAAL
76 80 3.2907E+11 3.4683E+11 3.2907E+11 3.4683E+11 AAASkyAAFAAAB7KAAb
76 80 3.3077E+11 3.4838E+11 3.3077E+11 3.4838E+11 AAASkyAAFAAAB7KAAZ
76 80 3.3170E+11 3.4521E+11 3.3170E+11 3.4521E+11 AAASkyAAFAAAB7KAAc
76 83 3.3172E+11 3.6106E+11 3.3172E+11 3.6106E+11 AAASkyAAFAAAB7LAAE
76 84 3.2834E+11 3.6458E+11 3.2834E+11 3.6458E+11 AAASkyAAFAAAB7LAAB
76 84 3.2902E+11 3.6541E+11 3.2902E+11 3.6541E+11 AAASkyAAFAAAB7LAAA
76 84 3.2935E+11 3.6652E+11 3.2935E+11 3.6652E+11 AAASkyAAFAAAB7LAAM
SQL> select min(GX),max(GX),min(GY),max(GY) from S3_IDX$;
MIN(GX) MAX(GX) MIN(GY) MAX(GY)
---------- ---------- ---------- ----------
51 134 80 110
从上面可以看到,在S3_IDX$表中存放了与CITIES表相同数量的记录,因为CITIES表是一个点层,因此每个几何对象(点)仅出现在一个空间索引中,如果是线层或者面层会出现比几何对象多的索引记录。S3_IDX$表的SP_ID字段存放了该索引对应的空间数据记录的ROWID;GX、GY字段分别对应了X和Y方向的网格序号,在这里我也把GX和GY的最大最小值打印了出来,你可以发现Max(GX)-Min(GX)约为80、Max(GY)-Min(GY)约为30,和我们上面估算的网格数量相符。同时,你可能也注意到Min(GX)和Min(GY)并不是0,因为这个Feature Class的Domain最小为X、Y均为-400,网格的序号是以此为原点进行计算的。
另外,ArcSDE对这个索引组织表S3_IDX$还创建有索引,这涉及到另外两个索引S3$_IX1、S3$_IX2:
CREATE UNIQUE INDEX "SDE"."S3$_IX1" ON "SDE"."S3_IDX$" ("GX", "GY", "MAXX", "MAXY", "MINX", "MINY", "SP_ID")
PCTFREE 0 INITRANS 4 MAXTRANS 255 COMPUTE STATISTICS
STORAGE(INITIAL 524288 NEXT 524288 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "SDE"
CREATE INDEX "SDE"."S3$_IX2" ON "SDE"."S3_IDX$" ("SP_ID")
PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
STORAGE(INITIAL 524288 NEXT 524288 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "SDE"
总的来说,ArcSDE中格网索引的结构如图 9所示,btw,图中的名称实际有可能有变化,比如A_IX1就可以是自己取的任何名字,具体以ArcSDE中的ST_GEOMETRY_INDEX表中的记录为准。
图 9 ArcSDE格网索引在数据库中的组织结构