智能大对象空间扩展数据块

将智能大对象添加到表时,数据库服务器将磁盘空间以称为数据块的单位分配到智能大对象空间。 每个数据块都是一个块,由来自智能大对象空间物理上连续的页组成。

即使智能大对象空间包含多个块,每个数据块都完整地分配到一个块内,从而保持连续。连续性对于 I/O 性能很重要。

当数据页面为连续时,磁盘臂运动就可在数据库服务器按顺序读取行时减到最小。扩展数据块机制是以下互相冲突的需求之间的一种折衷:

由于您可能无法预知智能大对象的数量和大小,因此不能指定智能大对象的数据块长度。因此,数据库服务器只有在需要时添加扩展数据块,但是要获得更好的性能,任何一个扩展数据块中的所有页都应该是连续的。此外,数据库服务器创建与上一个数据块相邻的新数据块时,它将这两个数据块视为一个数据块。

智能大对象空间数据块中的页数由以下方法之一确定:

这些函数是设置数据块大小的最佳方法,因为它们可以减少智能大对象中的数据块数量。数据库服务器将尝试把整个智能大对象作为一个数据块进行分配(如果块中存在该大小的可用数据块的话)。

要点: 对于大多数应用程序来说,应该使用数据库服务器为扩展数据块的大小计算的值。请勿使用 DataBlade API mi_lo_specset_extsz 函数或 GBase 8s ESQL/C ifx_lo_specset_extsz 函数设置智能大对象的数据块大小。

如果知道智能大对象的大小,建议您在 DataBlade API mi_lo_specset_estbytes() 函数或 GBase 8s ESQL/C ifx_lo_specset_estbytes() 函数中指定大小,而不是在 onspaces 实用程序或 CREATE TABLE 或 ALTER TABLE 语句中指定。这些函数是设置数据块大小的最佳方式,因为数据库服务器将整个智能大对象作为一个数据块分配(如果它在此块中有连续存储的话)。

超过 1 MB 的扩展数据块大小在 I/O 上优势不大,因为数据库服务器至多执行数倍于 60 KB 的读写操作。但是,数据库服务器在元数据区中注册智能大对象的每个数据块,因此,大型智能大对象会有很多数据块条目。当数据库服务器访问这些数据块条目时,它的性能会下降。在这种情况下,如果在 mi_lo_specset_estbytes() 函数或 ifx_lo_specset_estbytes() 函数中指定了智能大对象的最终大小,那么可以减少元数据区域中数据块条目的数目。

有关更多信息,请参阅改善智能大对象的元数据 I/O