ArcSDE性能优化之更改ST_GEOMETRY的点串的LOB为CACHE
LOB(large object)是一种用于存储大对象的数据类型,如医学记录(如X-射线)、视频、图像等。LOB有三种类型:BLOB:Binary Large Object、CLOB:Character Large Object、DBCLOB:Double-byteCharacter 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
我们可以看到尽管在注册时添加-t ST_GEOMETRY也不行,这可能是一个Bug吧
--------------------------------------------------------------------------------
SEGMENT_NAME CACHE
------------------------------ ----------
"SHAPE"."POINTS"
SYS_LOB0000076971C00016$ NO 那么我们可以使用以下命令进行修改 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进行编辑。
页:
[1]