在建立空间索引前必须先在USER_SDO_GEOM_METADATA中注册空间表。注册空间表语句如下所示:
INSERT INTO user_sdo_geom_metadata
(table_name, column_name, srid, diminfo)
VALUES
(
'CUSTOMERS', -- 表名
'LOCATION', -- geometry字段
8307, -- SRID
SDO_DIM_ARRAY -- DIMINFO 属性存储空间表中空间数据的范围和容差
(
SDO_DIM_ELEMENT
(
'X', -- 第一个元键名称
-180, -- 最小X
180, -- 最大X
0.5 -- 容差0.5 米),
SDO_DIM_ELEMENT
(
'Y', -- 第二个元键名称
-90, -- 最小Y
90, -- 最大Y
0.5 -- 容差0.5米)
)
);
在建立空间索引前必须注意,空间表中的SRID必须与USER_SDO_GEOM_METADATA中注册的SRID一致,因为在建立空间索引的时候,oracle会自动检查空间表中的SRID是否与USER_SDO_GEOM_METADATA中
的SRID一致,如果不一致,则会报ORA-13365 ERROR,但ORACLE不会取消的空间索引的建立,因
此需要手动删除已建立的索引,解决冲突后重新建立索引。
空间索引创建定义:
CREATE INDEX <indexname> on <tablename>(<columnname>)
indextype is mdsys.spatial_index
parameters('parameter_string')
可以不设置parameters,但对parameters的设置在一定程度上可以提高空间操作的数据。parameters字符串设置详情如下所示:
TABLESPACE
定义空间索引存储的表空间,NEXT和INITIAL是扩展TABLESPACE的变量。
例:PARAMETERS ('TABLESPACE=TBS_3 NEXT=5K INITIAL=10K')
WORK_TABLESPACE
定义空间索引在建立过程中使用的工作表的存储空间。在创建索引的R-tree索引进行排序操作将对整个记录集进行排序,因此,在创建索引的过程中会创建许多工作表,在索引创建完成后这些工作表会被删除,这个过程会在表空间里产生许多碎片。因为这些表并非临时表,因此不能使用oracle的临时表空间,它默认使用使用跟索引同样的表空间 为防止这种情况的发生,你可以为这些在建立索引时创建的临时工作表另外设置一个表空间。
例: PARAMETERS ('WORK_TABLESPACE=SYSAUX')
LAYER_GTYPE
定义创建索引的字段存储的集合类型,它有助于完善数据检查,同时在一定程度上提高空间查询的速度。例如,索引参数中设置LAYER_GTYPE=POINT,则表示geometry字段中只能存储point类型的数据,如果试图存入line类型的几何数据则会报错。
POINT——点
LINE——线
POLYGON——多边形
CURVE——曲线
MULTIPOINT——点集
MULTICURVE——多曲线
MULTIPOLYGON——多边形集
COLLECTION——复合
例:PARAMETERS ('LAYER_GTYPE=POINT');
SDO_INDX_DIMS
定义空间索引的维度,默认为二维。R-TREE可建立三维或四维空间数据的空间索引,
SQL> CREATE INDEX customers_sidx ON customers(location)
INDEXTYPE IS MDSYS.SPATIAL_INDEX
例:PARAMETERS ('SDO_INDX_DIMS=2');
SDO_DML_BATCH_SIZE
进行添加删除修改等操作时,包含空间索引的表并非直接删除表中数据,而是在SDO_DML_BATCH_SIZE指定的缓冲大小分批处理,此删除指定了添加删除修改等事务操作的缓冲大小,默认为1000;如果添加删除修改等事务操作的数据量很大的情况下,可以将SDO_DML_BATCH_SIZE设为5000或10000或其他,但注意SDO_DML_BATCH_SIZE设置大后对内存和其他系统资源的占用量也会增大。因此要视实际情况而定。
例: PARAMETERS ('SDO_DML_BATCH_SIZE=5000');
SDO_LEVEL
oracle默认索引为R-TREE索引,通过在索引参数中定义SDO_LEVEL可以创建四叉树索引,oracle
的四叉树索引目前只支持二维空间数据。
例:PARAMETERS ('SDO_LEVEL=8');
本人对此了解还很肤浅,如有不足的地方敬请指正。