ArcSDE10.5.1在Oracle中使用表分区

来源:互联网 发布:淘宝订单怎么打印 编辑:程序博客网 时间:2024/06/05 08:44
  1. 背景

在SDE地理空间库中存储地理数据是GIS应用在数据管理方面经常使用的方式,但是当某一个图层的数据量比较大的时候,往往会发现,图层的浏览和查询会变慢。可优化的方式很多,这里就讲一种比较实用的方式,表分区。下面以Oracle为例,其他的数据库类似。

Oracle提供了分区技术以支持VLDB(Very Large DataBase)分区表通过对分区列的判断,把记录分别存放在不同的表空间中,但是这个过程于上层的应用来说是透明    什么时候需要分区表,Oracle官方的2个建议:

(1)Tables greater than 2GB should always be considered for partitioning.

(2)Tables containing historical data, in which new data is added into the newest partition. A typical example is a historical table where only the current month's data is updatable and the other 11 months are read only.

分区提供以下优点:

(1)提高可用性:数据分散到各个分区中,减少了数据全部损坏的风险,如果表的某个分区出现故障,表在其他分区的数据仍然可用;

(2)便于维护:便于对单独的分区进行备份和恢复;如果表的某个分区出现故障,需要修复数据,只修复该分区即可;

(3)均衡IO:可以将分区映射到不同的物理磁盘上,来分散数据读写IO,提高整个系统的性能

(4)改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索速度。

缺点:已经存在的表没有方法可以直接转化为分区表。不过 Oracle 提供了在线重定义表的功能。

表进行分区后,逻辑上表仍然是一张完整的表,只是将表中的数据在物理上存放到多个表空间,这样查询数据时,不至于每次都扫描整张表。

  1. 配置步骤

  1. 创建多个表空间,这里以创建8个表空间为例,具体SQL如下:

CREATETABLESPACE sde01 DATAFILE

'C:\APP\ADMINISTRATOR\ORADATA\ORCL\SDEDATAPART01.DBF'SIZE100M AUTOEXTENDONNEXT100M MAXSIZEUNLIMITED

LOGGING

EXTENTMANAGEMENTLOCALAUTOALLOCATE

BLOCKSIZE8K

SEGMENTSPACEMANAGEMENTAUTO

FLASHBACKON;

CREATETABLESPACE sde02 DATAFILE

'C:\APP\ADMINISTRATOR\ORADATA\ORCL\SDEDATAPART02.DBF'SIZE100M AUTOEXTENDONNEXT100M MAXSIZEUNLIMITED

LOGGING

EXTENTMANAGEMENTLOCALAUTOALLOCATE

BLOCKSIZE8K

SEGMENTSPACEMANAGEMENTAUTO

FLASHBACKON;

CREATETABLESPACE sde03 DATAFILE

'C:\APP\ADMINISTRATOR\ORADATA\ORCL\SDEDATAPART03.DBF'SIZE100M AUTOEXTENDONNEXT100M MAXSIZEUNLIMITED

LOGGING

EXTENTMANAGEMENTLOCALAUTOALLOCATE

BLOCKSIZE8K

SEGMENTSPACEMANAGEMENTAUTO

FLASHBACKON;

CREATETABLESPACE sde04 DATAFILE

'C:\APP\ADMINISTRATOR\ORADATA\ORCL\SDEDATAPART04.DBF'SIZE100M AUTOEXTENDONNEXT100M MAXSIZEUNLIMITED

LOGGING

EXTENTMANAGEMENTLOCALAUTOALLOCATE

BLOCKSIZE8K

SEGMENTSPACEMANAGEMENTAUTO

FLASHBACKON;

CREATETABLESPACE sde05 DATAFILE

'C:\APP\ADMINISTRATOR\ORADATA\ORCL\SDEDATAPART05.DBF'SIZE100M AUTOEXTENDONNEXT100M MAXSIZEUNLIMITED

LOGGING

EXTENTMANAGEMENTLOCALAUTOALLOCATE

BLOCKSIZE8K

SEGMENTSPACEMANAGEMENTAUTO

FLASHBACKON;

CREATETABLESPACE sde06 DATAFILE

'C:\APP\ADMINISTRATOR\ORADATA\ORCL\SDEDATAPART06.DBF'SIZE100M AUTOEXTENDONNEXT100M MAXSIZEUNLIMITED

LOGGING

EXTENTMANAGEMENTLOCALAUTOALLOCATE

BLOCKSIZE8K

SEGMENTSPACEMANAGEMENTAUTO

FLASHBACKON;

CREATETABLESPACE sde07 DATAFILE

'C:\APP\ADMINISTRATOR\ORADATA\ORCL\SDEDATAPART07.DBF'SIZE100M AUTOEXTENDONNEXT100M MAXSIZEUNLIMITED

LOGGING

EXTENTMANAGEMENTLOCALAUTOALLOCATE

BLOCKSIZE8K

SEGMENTSPACEMANAGEMENTAUTO

FLASHBACKON;

CREATETABLESPACE sde08 DATAFILE

'C:\APP\ADMINISTRATOR\ORADATA\ORCL\SDEDATAPART08.DBF'SIZE100M AUTOEXTENDONNEXT100M MAXSIZEUNLIMITED

LOGGING

EXTENTMANAGEMENTLOCALAUTOALLOCATE

BLOCKSIZE8K

SEGMENTSPACEMANAGEMENTAUTO

FLASHBACKON;

这个过程一般来说,正式环境是需要数据库管理员来完成,你只需要告诉他你需要多少个表空间以及每个表空间的初始大小,未来预计数据的增长量即可。

  1. 将SDE用户配置以上创建的表空间:

    alteruser SDE quotaunlimitedon sde01;

    alteruser SDE quotaunlimitedon sde02;

    alteruser SDE quotaunlimitedon sde03;

    alteruser SDE quotaunlimitedon sde04;

    alteruser SDE quotaunlimitedon sde05;

    alteruser SDE quotaunlimitedon sde06;

    alteruser SDE quotaunlimitedon sde07;

    alteruser SDE quotaunlimitedon sde08;

    当然你也可以通过PLSQL在可视化界面中进行操作,如下图:

  2. 导出地理数据库的数据存储参数

    使用【导出地理数据库配置关键字】工具将SDE的dbtune配置参数导出来:

    这个工具的参数只有两个:

    1. SDE的数据库连接
    2. 输出文件的路径
  3. 修改数据存储参数

    用文本编辑器打开上一步骤导出的sde文件,然后找到##DEFAULTS,复制默认关键字配置的内容,如下图:

    然后将DEFAULTS改个名称,这里我改成BIGDATASTORE,顾名思义就是大数据存储(汗一个!),同时找到B_STORAGE一行,在其中加入分区的SQL代码,如下图:

PARTITION BY HASH (OBJECTID) (PARTITION PART01 TABLESPACE SDE01, PARTITION PART02 TABLESPACE SDE02, PARTITION PART03 TABLESPACE SDE03, PARTITION PART04 TABLESPACE SDE04, PARTITION PART05 TABLESPACE SDE05, PARTITION PART06 TABLESPACE SDE06, PARTITION PART07 TABLESPACE SDE07, PARTITION PART08 TABLESPACE SDE08)

这里我用的Hash分区,简单来说,Hash分区会将表中的数据平均分配到你指定的几个分区中。至于具体的Hash分区内容,可以移步详见第3.2章节。、

到这里已经定义好数据存储的分区规制。

注意:这里的分区SQL代码必须要留意空格!关键字和括号之间必须要预留一个空格!!!特别是使用Range分区的时候,一不小心就会在创建要素类时遇到下面这个错误:

  1. 导入地理数据库的数据存储参数

    参数修改好了,接下就把改好的文件导回到SDE 库中。同样的ArcGIS也提供相应的工具来导入数据存储参数:

    这个工具和导出的工具在同一个工具箱下:【系统工具箱】à【Data Management Tools】à【地理数据库管理】。点击确定就可以导入成功!

  1. 使用【自定义关键字】创建要素类

    接下来就在SDE上创建一个要素类,这里以点要素为例,创建的过程和没有使用表分区的过程类似,只需要修改其中的一步:

    在到制定数据库存储配置的时候,需要我们自定义的存储配置名称,否则的话使用的将是默认的存储配置。

  2. 加载数据测试

    点要素类建好了之后,就可以加载一些样例数据进去进行测试,可以通过右键点击要素类à加载à加载数据工具来加载样例数据:

    我这里加载了202081个点数据:

    我们再针对每个分区进行统计:

    发现每个分区存储的数据量都差不多,到这里我们已经成功在SDE中使用表分区功能来存储我们的图层了。

    至于效率方面,20万的数据在ArcMap中加载大约需要3秒钟就可以全部加载完成。对比默认的存储方式,效率有了很大的改善,至于改善了多少,后续我们在用另外一个工具来做深入的测试。

    1. 关于Oracle的表分区

    2. Range分区

Range分区是以列的值的范围来作为分区条件,将记录存放到列值对应范围的表空间中。譬如下面是通过OBJECTID字段进行Range分区,OBJECTID的值小于20时存放在SDE01表空间中,其他的存放在SDE02表空间中,如下:

PARTITION BY RANGE (OBJECTID) (PARTITION PART01 VALUES LESS THAN (20) TABLESPACE SDE01,PARTITION PART02 VALUES LESS THAN (MAXVALUE) TABLESPACE SDE02)

当然也可以通过日期进行划分,譬如我们可以将2017年1月的数据放到a分区,2月的数据放到b分区等等。

  1. Hash分区

Hash分区会将表中的数据平均分配到你指定的几个分区中,列所在分区是依据分区列的hash值自动分配,因此你并不能控制也不知道哪条记录会被放到哪个分区中,hash分区也可以支持多个依赖列。建议分区的数量采用2的n次方,这样可以使得各个分区间数据分布更加均匀。下面的例子是对OBJECTID字段进行hash分区,同时指定了每个分区对应的表空间:

PARTITION BY HASH (OBJECTID) (PARTITION PART01 TABLESPACE SDE01, PARTITION PART02 TABLESPACE SDE02, PARTITION PART03 TABLESPACE SDE03, PARTITION PART04 TABLESPACE SDE04, PARTITION PART05 TABLESPACE SDE05, PARTITION PART06 TABLESPACE SDE06, PARTITION PART07 TABLESPACE SDE07, PARTITION PART08 TABLESPACE SDE08)

  1. List分区

List分区根据列值对应的值进行分区,其分区值必须明确指定,而且分区列只能有一个,不能像range或者hash分区那样同时指定多个列作为分区列。在分区时必须确定分区列可能存在的值,一旦插入的列值不在分区范围内,则插入/更新就会失败,因此通常建议使用list分区时,要创建一个default分区存储那些不在指定范围内的记录,类似range分区中的maxvalue分区。下面的例子是对城市代码CITYCODE字段进行分区,同时制定了默认分区:

PARTITION BY LIST (CITYCODE)( PARTITION PART01 VALUES ('001') TABLESPACE SDE02, PARTITION PART02 VALUES ('002') TABLESPACE SDE02, PARTITION PART03 VALUES ('003') TABLESPACE SDE04, PARTITION SDEOTHER VALUES (DEFAULT) TABLESPACE SDE04)

原创粉丝点击