设置 DBTUNE 参数来存储 BLOB 列
DBTUNE 表的存储参数控制着 ArcGIS 如何在 Oracle 中创建表和索引。有些存储参数还决定着创建表时使用的数据类型。有关 DBTUNE 表的详细信息,请参阅什么是 DBTUNE 表?有关 DBTUNE 存储参数的常规信息,请参阅什么是 DBTUNE 配置关键字和参数?
ArcSDE DBTUNE 存储参数 GEOMETRY_STORAGE、RASTER_STORAGE 和 ATTRIBUTE_BINARY 决定着存储 ArcSDE 数据所使用的 Oracle 数据类型。
GEOMETRY_STORAGE 参数控制着在要素类中存储矢量数据的方式。RASTER_STORAGE 参数控制着在栅格数据集、栅格目录或栅格属性中存储栅格数据的方式。最后,ATTRIBUTE_BINARY 参数控制着既不是矢量也不是栅格的所有其他二进制数据的存储。
要创建 BLOB 列,必须在给定 DBTUNE 关键字中对参数进行如下设置:
GEOMETRY_STORAGE SDELOB
RASTER_STORAGE BLOB
ATTRIBUTE_BINARY BLOB
对于矢量数据和栅格数据,ESRI 推荐使用以下 LOB 存储参数:始终启用行内存储,因为多数地理信息系统 (GIS) 数据小于 3964 个字节(行内阈值)。在行内存储数据可提供最佳性能。
启用缓存,因为会频繁读取 ArcSDE 数据。
由于 ArcSDE 不对 BLOB 数据执行更新,而只是执行插入和删除,因此将 PCT_VERSION 设置为 0,这样做是因为无需保留 LOB 段内较旧版本的数据。
不应使用小于 8K 的区段大小。2K 和 4K 的区段大小会增加 I/O 量,因为 Oracle 服务器进程必须提取更多区段。您可能会发现 8K 的区段大小比 16K 的区段大小浪费的空间量少。如果使用 2K 或 4K 的区段大小,您会发现浪费的空间量较少,但经测试发现,与使用 8K 的区段大小存储时相比,多数栅格数据和矢量数据的显示时间有明显地增加。由于区段大小必须始终是数据块大小的倍数,所以用于在 BLOB 中存储 GIS 数据的最佳数据块大小是 8K。
以下示例说明了为适合以 BLOB 数据类型存储的栅格块表而对栅格 DBTUNE 存储参数进行修改后的结果:
RASTER_STORAGE "BLOB"
BLK_STORAGE "PCTFREE 0 INITRANS 4 TABLESPACE RASTER
LOB (BLOCK_DATA) STORE AS
(TABLESPACE RASTER_LOB_SEGMENT
CACHE PCTVERSION 0)"
AUX_STORAGE "PCTFREE 0 INITRANS 4 TABLESPACE RASTER
LOB (OBJECT) STORE AS
(TABLESPACE RASTER
CACHE PCTVERSION 0)"
RASTER_STORAGE "ST_RASTER"
BLK_STORAGE "PCTFREE 0 INITRANS 4 TABLESPACE RASTER
LOB (BLOCK_DATA) STORE AS
(TABLESPACE RASTER_LOB_SEGMENT
CACHE PCTVERSION 0)"
如果栅格块像素数据小于 3965 个字节,该数据将存储在 RASTER 表空间的 BLOCK_DATA 列中。但是,如果超过此阈值,则将存储在 RASTER_LOB_SEGMENT 表空间的 LOB 段中。仅当区段数超过 12 时才使用 LOB 索引。对于 ArcSDE 数据,不太可能发生这种情况。考虑使用 8K 区段大小的 LOB 段。仅当 ArcSDE 二进制数据超过 96K 时,才可使用 LOB 索引。
以下示例说明了为适合以 BLOB 数据类型存储的要素表而对矢量 DBTUNE 存储参数进行修改后的结果:
GEOMETRY_STORAGE "SDELOB"
F_STORAGE "PCTFREE 0 INITRANS 4 TABLESPACE VECTOR
LOB (POINTS) STORE AS
(TABLESPACE VECTOR_LOB_SEGMENT
CACHE PCTVERSION 0)"
GEOMETRY_STORAGE "ST_GEOMETRY"
如果要素的二进制数据小于 3965 个字节,该数据将存储在 VECTOR 表空间的 POINTS 列中。但是,如果超过此阈值,则将存储在 VECTOR_LOB_SEGMENT 表空间的 LOB 段中。
ATTRIBUTE_BINARY "BLOB"
B_STORAGE "PCTFREE 0 INITRANS 4 TABLESPACE BIZZTABS
LOB (DOCUMENT) STORE AS
(TABLESPACE BIZZ_LOB_SEGMENT
CACHE PCTVERSION 0)"
A_STORAGE "PCTFREE 0 INITRANS 4 TABLESPACE BIZZTABS
LOB (DOCUMENT) STORE AS
(TABLESPACE BIZZ_LOB_SEGMENT
CACHE PCTVERSION 0)"
在本示例中,如果业务表的二进制数据小于 3965 个字节,该数据将存储在 BIZZTABS 表空间的业务表的 BLOB 列中。但是,如果超过此阈值,则将存储在 BIZZ_LOB_SEGMENT 表空间的 LOB 段中。本示例中的 BLOB 列为 DOCUMENT。如果上方的 B_STORAGE DBTUNE 参数用来创建没有 DOCUMENT 列的表,Oracle 将返回以下错误:
ORA-00904: "DOCUMENT": invalid identifier
因此,最好不要将引用特定 BLOB 列的 B_STORAGE 或 A_STORAGE 参数添加到 DEFAULTS 关键字,因为业务表必须包含这些列。相反,您可以创建单独的 DBTUNE 关键字,然后将这些存储参数添加到这些关键字中。在创建表期间将引用包含存储参数的关键字。还应注意,如果特定的关键字不包含存储参数,则将使用 DEFAULTS 关键字的存储参数。鉴于这种情况,如果某关键字的配置字符串与 DEFAULTS 关键字下的存储参数相同,则无需在该关键字中添加特定的存储参数。例如,如果新关键字 ROADS 的所有存储参数(除 B_STORAGE 和 A_STORAGE 以外)都具有与 DEFAULTS 关键字的存储参数相同的配置字符串,那么您只需在 ROADS 关键字下创建 B_STORAGE 和 A_STORAGE 参数。其他所有存储参数都从 DEFAULTS 关键字读取,因为 ROADS 关键字不包含这些参数。