ArcSDE性能优化系列之索引篇

一说到ArcSDE性能优化的问题,相信好多用户会提到索引,是的索引是会提高我们的查询性能,本文重点说明一下ArcSDE的空间索引的运行机制,以及原理。

说明一下,本文是对在SDE库里面的一个面状图层(DLT)进行相关的系列研究,当我们将该数据导入到SDE库里面,只要是通过ArcGIS客户端软件导入的数据,ArcSDE会自动创建以ObjectID(一般是这个,如果你是以其他值为唯一ID比如下图的ObjectID_1)的属性索引,和空间索引,我们借助于ArcCatalog也可以看到。

ArcSDE性能优化系列之索引篇_第1张图片

所以,当数据导入进去,ArcGIS已经根据数据情况创建了比较合理的索引,其实在这个时候任何想在索引方面做点文章来提高性能的情况一般没有什么意义或者说意义不大,不过假如你做了相关的编辑操作就有可能不一样了,这是后话,但是今天我们会给大家介绍介绍空间索引是怎么工作的。

空间格网索引

Oracle 和 DB2 中的 ArcSDE 地理数据库使用格网索引。空间索引通过将格网应用到空间列中的数据构建而成。空间格网索引是二维的,并且涵盖一个要素类范围,类似于一般道路地图上的参考格网。您可以将空间格网索引划分为成一个、两个或三个格网等级,每个等级的像元大小各不相同。必不可少的第一层格网等级的像元大小最小。第二层和第三层格网像元等级为可选等级,将其设置为 0 时不可用。如果启用第二层和第三层格网像元等级,则第二层格网像元的大小至少必须是第一层格网像元大小的三倍,而第三层网格像元的大小至少必须是第二层网格像元大小的三倍。

在下例中,要素类具有两个格网等级。区域形状 101 位于等级 1 的格网像元 4 中。空间索引表上会添加一条记录,这是因为要素所占格网像元数小于四个(本例中仅占一个像元)。区域要素 102 的包络矩形位于等级 1 的像元 1 到 8 中。由于要素的包络矩形所占格网像元数大于四个,因此要素被将提升到等级 2,在等级 2 中,其包络矩形拟合于两个格网像元中。要素 102 在等级 2 中建立索引,而且空间索引表中会添加两条记录。

ArcSDE性能优化系列之索引篇_第2张图片

插入、更新或删除要素会更新空间索引。每个要素的范围都会叠加到最低格网等级上,从而获得格网像元的数量。如果要素超过为 SERVER_CONFIG 表中的 MAXGRIDSPERFEAT 值设置的值,则在已定义更高等级的情况下,几何会被提升至下一较高等级。

MAXGRIDSPERFEAT默认值8000,如果超过的话会弹出

ArcSDE性能优化系列之索引篇_第3张图片

设置格网

根据上面的问题估计有用户问了,我的格网值设置多大为好,什么时候只设置一级格网,什么时候需要设置多级格网?

参考:http://www.gissky.net/Article/1408.htm

上面的可以用户根据数据精确设置,但是对大多数用户来说不用这样,根据第一个界面重新计算即可。

但是需要说明的一般情况下一级索引都已经足够使用了,对点要素类,肯定只能设置一级索引,规则的线或者面要素类也是只设置一级索引,规则的面好理解,面形状大小差不多,比如常见的居民地宗地大小,基本上都是四四方方的,规则的线要素类也就可以理解为,没有说出现特别长的线,一条线连跨几个县什么的情况,那么与此相反,数据不是很规则,有大有小,有长有短,那么也就是一个网格不一定能够包含要素,也可以理解为一个要素要跨N个网格,那么我们就需要建立二级索引,三级索引,但是需要注意的是二级索引值一般是一级索引的三倍以上,三级同理。

下面我们就看看索引是怎么回事?通过以下语句我们可以看到针对某个要素类表(DLT)所参与的相关索引。

SQL> select index_name,index_type from dba_indexes where table_name='DLT'; INDEX_NAME INDEX_TYPE ------------------------------ --------------------------- A71_IX1 DOMAIN R95_SDE_ROWID_UK NORMAL SYS_IL0000073347C00041$$ LOB

那么那些数字怎么理解呢,这需要对ArcSDE 相关Schema表比较熟悉,以前的文档以及说明过了,这里不再赘述。

可以参考:http://wenku.baidu.com/view/e6df246e58fafab069dc02c4.html

SQL> select registration_id from table_registry where table_name='DLT'; REGISTRATION_ID --------------- 95 SQL> select layer_id from layers where table_name='DLT'; LAYER_ID ---------- 71 SQL> select index_ID from st_geometry_index where table_name='DLT'; INDEX_ID ---------- 69

那么怎么分辨这几个索引是什么呢?

SQL> select dbms_metadata.get_ddl('INDEX','A71_IX1','SDE') from dual; DBMS_METADATA.GET_DDL('INDEX','A71_IX1','SDE') -------------------------------------------------------------------------------- CREATE INDEX "SDE"."A71_IX1" ON "SDE"."DLT" ("SHAPE") INDEXTYPE IS "SDE"."ST_SPATIAL_INDEX" PARAMETERS ('ST_GRIDS = .008 ST_SRID = 000 PCTFREE 0 INITRANS 4') ******************************************************************************************** SQL> select dbms_metadata.get_ddl('INDEX','R95_SDE_ROWID_UK','SDE') from dual; DBMS_METADATA.GET_DDL('INDEX','R95_SDE_ROWID_UK','SDE') -------------------------------------------------------------------------------- CREATE UNIQUE INDEX "SDE"."R95_SDE_ROWID_UK" ON "SDE"."DLT" ("OBJECTID_1") PCTFREE 0 INITRANS 4 MAXTRANS 255 NOLOGGING COMPUTE STATISTICS STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) TABLESPACE "SDE"

可以看到,这里面我们重点说明两个索引,一个是R95_SDE_ROWID_UK,类型是NORMAL,然后查看该索引的定义,建立在ObjectID_1的属性索引,从95可以看出来这是对基表的(属性表)的索引。

那么A71_IX1,类型是DOMAIN,在查看该索引定义,建立在SHAPE的空间索引,从71可以看出是从Layers的获得空间数据的图层ID。

但是大家都知道在ArcGIS9.3之后都默认使用ST_Geometry,那么是以B表(基表)和S表(空间索引表)来存储的,所以说看如下图

ArcSDE性能优化系列之索引篇_第4张图片

当我们接到一个空间查询我们就不说版本的问题了,其实都是一样的,我们走空间索引,先走S表进行筛选,然后去基表中(DLT)定位查询结果,那么A71_IX1与S69_IDX$是什么关系呢,A71_IX1是一个索引的对象,S69_IDX$是该索引对象指向的索引表,我觉得可以类比Oracle的ORACLE_SID和实例的关系(如果不认同就当我没说)。

SQL> desc S69_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

举个例子吧

不是特别严谨,但是能说明问题

黄颜色表明一级格网

黑颜色表明需要查询的多边形

蓝颜色表明需要查询多边形的外包矩形

ArcSDE性能优化系列之索引篇_第5张图片

当我们受到一个查询的任务,比如说黑色的多边形,那么我们首先是根据黑色多边形的外包矩形来查询S表获得满足条件的数据,然后再让满足条件的数据与查询的多边形进行比较获得查询结果数据。

那么一开始我们的数据导入之后自动创建索引,当我们进行数据编辑时,可能原来在一个索引的要素经过合并后被几个格网所覆盖,因为我们在编辑过程中不可能修改格网,所以类似这种情况我们就需要重建索引,其实也就是重新估算一下格网大小的一个过程。

在ArcSDE命令的sdelayer -o si_stats也有对图层索引信息的相关说明。

详细参考:http://wenku.baidu.com/view/6dfcdb0216fc700abb68fcc2.html

或者ArcSDE命令帮助文档。

另外,用户在使用ST_Geometry进行编辑操作时,也可能创建相关的空间索引

CREATE INDEX farm_idx on farm(shape) INDEXTYPE is SDE.ST_SPATIAL_INDEX PARAMETERS ('st_grids=1000,3000,9000 st_srid=31'); /

//在 Oracle 中创建空间索引时,如果检测到格网大小过大或过小,则会出现以下错误: CREATE INDEX farm_idx on farm(shape) * ERROR at line 1: ORA-20006: InValid Grid Size ORA-06512: at "SDE.ST_GEOMETRY_SHAPELIB_PKG", line 43 ORA-06512: at "SDE.ST_POLYGON", line 236

参考文档:

空间索引内部运行机制:

http://blog.csdn.net/liufeng1980423/archive/2010/12/17/6082038.aspx

http://blog.csdn.net/liufeng1980423/archive/2010/12/17/6082086.aspx

说明

该文档为作者在学习ArcGIS的一些笔记(自己学习、ArcGIS帮助、网络资源、高手请教相结合),难免有一些表达不全面或者理解有出入的,还请各位多多指教!

广告博客

http://www.gisall.com/index.php?uid-121719 :欢迎访问GIS博客

http://blog.csdn.net/linghe301:欢迎访问GIS博客

或者在百度文科上搜索:linghe301

By Lish

 

 

你可能感兴趣的:(oracle,sql,null,table,性能优化,文档)