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
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进行编辑。