ArcSDE性能优化之更改ST_GEOMETRY的点串的LOB为CACHE


     LOB(large object)是一种用于存储大对象的数据类型,如医学记录(如X-射线)、视频、图像等。LOB有三种类型:BLOB:Binary Large Object、CLOB:Character Large Object、DBCLOB:Double-byte  Character Large Object。每个LOB可以有2GB。


      我们可以查看一下ST_GEOMETRY的结构

SQL> desc st_geometry;
 st_geometry 不是最终的
 名称                                      是否为空? 类型
 ----------------------------------------- -------- -----------
 ENTITY                                             NUMBER(38)
 NUMPTS                                             NUMBER(38)
 MINX                                               FLOAT(64)
 MINY                                               FLOAT(64)
 MAXX                                               FLOAT(64)
 MAXY                                               FLOAT(64)
 MINZ                                               FLOAT(64)
 MAXZ                                               FLOAT(64)
 MINM                                               FLOAT(64)
 MAXM                                               FLOAT(64)
 AREA                                               FLOAT(64)
 LEN                                                FLOAT(64)
 SRID                                               NUMBER(38)
 POINTS                                             BLOB


      那么我们可以看到ST_GEOMETRY不管是点、线、面,到最后都是以点串的形式存储BLOB,那么我们可以从在安装ArcSDE PostInstallation看到DBTUNE的配置文件关于ST_GEOMETRY中LOB的定义

GEOMETRY_STORAGE    "ST_GEOMETRY"
ST_GEOM_LOB_STORAGE  " STORE AS (
#                      TABLESPACE <lob segment tablespace_name>
                       ENABLE STORAGE IN ROW CHUNK 8K RETENTION CACHE) "

      那么我们可以清楚的看到ArcGIS默认的LOB对象是以CACHE存储的。

      如果你只有小规模或者中等规模的LOB(例如使用LOB存储只有几KB的描述性文字),对其缓存就很有意义。如果不缓存,当用户更新描述字段时,还必须等待I/O将数据写至磁盘(将执行一个CHUNK大小的I/O,而且用户要等待这个I/O完成)。如果你在执行多个LOBde加载,那么加载每一行时都必须等待这个I/O完成,所以启动这些LOBde缓存很合理,如果一个大小为50MB的LOB,启动缓存也没有什么可以提高性能的意义了。

那么如果我们使用ArcSDE SQL操作时,我们需要创建一个ST_GEOMETRY字段的数据表,然后对表进行注册sdelayer -o register,但是我们看一下

SQL> create table rrr (shape sde.st_geometry);

表已创建。

SQL> select dbms_metadata.get_ddl('TABLE','RRR') from dual;

DBMS_METADATA.GET_DDL('TABLE','RRR')
--------------------------------------------------------------------------------

  CREATE TABLE "TEST"."RRR"
   (    "SHAPE" "SDE"."ST_GEOMETRY"
   ) SEGMENT CREATION IMMEDIATE
  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAUL
T CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "ESRI"
 LOB ("SHAPE"."POINTS") STORE AS BASICFILE (
  TABLESPACE "ESRI" ENABLE STORAGE IN ROW CHUNK 8192 PCTVERSION 10

DBMS_METADATA.GET_DDL('TABLE','RRR')
--------------------------------------------------------------------------------
  NOCACHE LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAU
LT))

即使我们使用Sdelayer -o register进行注册,相关的LOB仍然是NOCACHE状态,我们也可以进行相关的查询

SQL> select column_name,segment_name, cache from user_lobs where table_name='RRR';

COLUMN_NAME
--------------------------------------------------------------------------------
SEGMENT_NAME                   CACHE
------------------------------ ----------
"SHAPE"."POINTS"
SYS_LOB0000076971C00016$      NO

我们可以看到尽管在注册时添加-t ST_GEOMETRY也不行,这可能是一个Bug吧


那么我们可以使用以下命令进行修改

SQL> alter table rrr modify lob(shape.points)(CACHE);

表已更改。

SQL> select column_name,segment_name, cache from user_lobs where table_name='RRR';

COLUMN_NAME
--------------------------------------------------------------------------------
SEGMENT_NAME                   CACHE
------------------------------ ----------
"SHAPE"."POINTS"
SYS_LOB0000076971C00016$      YES

这方面在电信、电力的ArcGIS应用方面应该需要注意,因为这些行业基本上都是属于自己创建表,然后注册,然后使用SQL进行编辑。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值