Oracle Spacial(空间数据库)使用注意事项

1、数据建模和数据装载

1.1 始终验证数据的有效性

通过验证函数SDO_GEOM.VALIDATE_*执行验证。或者通过SDO_MIGRATE.TO_CURRENT函数修正任何无效多边形几何体的取向。

网络模型就应使用SDO_NET.VALIDATE_NETWORK函数来验证网络的有效性。

1.2 始终将二维点和三维点存储在SDO_POINT中

为了存储二维点和三维点应当一直使用SDO_GEOMETRY数据类型的SDO_POINT属性。把SDO_ELEM_INFO和SDO_ORDINATES属性设置为NULL。这样可以确保更少的存储要求和更快的存储速度。

1.3 使用TO_CURRENT修正多边形几何体的取向

Oracle spatial需要多边形几何体的边界是逆时针取向的。如果多边形为顺时针取向, 可以通过该函数改变它的取向。

1.4 使用SDO_UNION函数修正一个自交的多边形

对于一个自交的多边形进行验证时会提示多边形边界穿过自身的错误,因此通过该函数可以得到修正。

1.5 始终存储需要的维数或位数

一个三维的几何体,每个点就有三个坐标,而第三个点坐标往往是0值,如果将这些0值清除会省出很多空间。

另外,坐标值中的小数点位,根据需要来取,减少小数点位数可以减少存储空间,并提高几何体的输入输出性能。

2、     空间查询操作符的性能

2.1 指定LAYER_GTYPE参数

    如果表仅包含单纯的点数据或线数据或面数据,在创建索引时指定LAYER_GTYPE参数的值,这样就可以提高查询。

3、     空间处理函数的性能

3.1 为存储函数指定DETERMINISTIC

3.2 SDO_AGGR_UNION使用分治法

分组进行并运算

4、     插入、删除、更新的性能

在一个表的一个或多个列上建立了空间索引,那么在该表上的插入、删除、更新操作将花费更长时间,因为索引要实时更新。

方法一、在修改大量记录之前先将索引撤销(修改表中超过30%的记录左右),之后再创建索引

注:如果空间索引撤销,就不能执行空间操作符的操作

方法二、

在同一事务中,如果批量执行插入、删除或更新操作,就能够最小化空间索引的性能开销。如果想要在一个典型的事务中执行1000多个那样的操作(该建议适用于每个事务含有超过1000个的插入、删除或更新操作),可以通过指定createINDEX语句的参数sdo_dml_batch_size微调以下性能。默认情况下,被设置为1000.当然如果批量修改的量大,也可以根据实际情况修改。

create indexcola_markets_spatial_geo_idx on cola_markets(LOCATION)

indextype is mdsys.spatial_index

 parameters ('sdo_dml_batch_size=5000');

sdo_dml_batch_size的值应该在1-10000之间,如果超过10000将会导致许多内存消耗,并不能带来明显的性能改善。

如果已经创建了空间索引,就能够为特定的空间索引手动地在MDSYS模式的SDO_INDEX_METADATA_TABLE表(USER_SDO_INDEX_METADATA和USER_SDO_INDEX_INFO字典视图)中修改这一参数。注意,不能修改该表中的其他参数,否则会导致使用空间操作符的操作失败。

5、     空间索引的扩展性和可操纵性

5.1使用表分区(和本地空间索引)

Oracle的表分区特性及本地空间索引的使用

表的分区:

CREATETABLE weather_patterns

(

 gid NUMBER,

 geom SDO_GEOMETRY,

 creation_date VARCHAR2(32)

)

PARTITIONBYRANGE(creation_date)

(

 PARTITION p1 VALUESLESSTHAN ('2000-01-01') TABLESPACE tbs_3,

 PARTITION p2 VALUESLESSTHAN ('2001-01-01') TABLESPACE tbs_3,

 PARTITION p3 VALUESLESSTHAN ('2002-01-01') TABLESPACE tbs_3,

 PARTITION p4 VALUESLESSTHAN ('2003-01-01') TABLESPACE tbs_3,

 PARTITION p5 VALUESLESSTHAN ('2004-01-01') TABLESPACE tbs_3,

 PARTITION jan VALUESLESSTHAN ('2004-02-01'),

 PARTITION feb VALUESLESSTHAN ('2004-03-01'),

 PARTITION current_month VALUESLESSTHAN (MAXVALUE)

);

weather_patterns表基于creation_date列创建了一个分区表。前5个分区指定了表空间,后几个没有指定表空间默认被存储到当前表所在的表空间。

为表创建一个本地分区空间索引,即每个分区创建一个独立的索引(创建空间索引之前要在元数据表中插入相应的记录):

CREATEINDEX weather_patterns_sidx onweather_patterns(geom)

INDEXTYPEISmdsys.spatial_index LOCAL;

5.2 本地索引创建为UNUSABLE

CREATEINDEX weather_patterns_sidx onweather_patterns(geom)

INDEXTYPEIS mdsys.spatial_index LOCALUNUSABLE;

指定为UNUSABLE后,该索引只是一个虚构的索引,任何空间查询操作符,表上的查询、插入、删除、更新操作或者指定的分区等,将引发一个错误,指出分区是UNUSABLE

因此,处理前应当重建分区上的索引。

5.3为每个分区单独重建空间索引

如下:

ALTERINDEX weather_patterns_sidx REBUILDPARTITION p1;

同样,可以为每个分区分别重建本地索引。通过在多个SQL*PLUS会话中重建那些索引,可以实现并行操作。

分别重建本地索引将在分区索引创建上提供更多的控制权。如一个分区失败,整个索引并没有被标识为失败。即不必为所有的分区重建索引。相反,只需对创建失败的分区重建索引。

可以采用ALTER TABLE…REBUILD UNUSABLE INDEXES 命令一次性地为一个分区重建所有的UNUSABLE索引。

ALTERTABLEweather_patterns_sidx REBUILDPARTITION p1 UNUSABLELOCALINDEXES;

5.4在索引创建失败的分区上使用交换分区

重建空间索引可能因为某个原因导致失败,原因主要有分区指定的表空间空间不足或者在表分区的索引列中存在无效的几何体。如果增加表的大小后,再重新执行空间索引的重建操作,索引将被成功创建。但是如果分区中存在无效的几何体,重新执行索引的重建语句将不起作用。此时,将不能更新或删除与无效几何体相应的记录。Oracle对于那些操作或许会产生“分区被标记为faild/unusable”的错误。

为避免上述错误,在创建空间索引之前应该对数据进行验证。

如果出现了“索引失败”的情况,可通过交换分区的方法解决:

首先创建一个临时表tmp,结构与之一样。然后在tmp表中创建一个空间索引。然后执行如下分区操作:

ALTERTABLEweather_patterns EXCHANGEPARTITIONcurrent_month WITHTABLE tmp EXCLUDINGINDEXES;

此时,tmp表将会有先前weather_patterns表p1分区的数据。由于tmp表不是一个分区表,所以可以在该表上执行常规的DML操作并更正表中无效几何体记录。修正好后,在执行上sql语句将正确数据放回p1分区中。

5.5对新数据使用含有索引的交换分区

如果每天有大量数据更新到current_month分区中,如何确保current_month分区中的数据实时更新?

方法一:采用批量的更新

方法二:创建一个临时表tmp,与上述5.4介绍的类似,同交换实现更新,只是在更新时也包括索引。

ALTERTABLEweather_patterns EXCHANGEPARTITION current_month WITHTABLE tmp INCLUDINGINDEXES;

5.6拆分分区

ALTERTABLE weather_patterns

SPLITPARTITION current_month AT ('2010-04-1') INTO

(

 PARTITION march,

 PARTITION current_month

);

 

5.7合并分区

MERGEPARTITION jan,PARTITION feb INTOPARTITION janfeb;

对一个分区重命名

ALTER INDEX weather_patterns_sidx RENAME PARTITION janfeb TO jan;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值