长值列

适用于: Windows |Windows Server

长值列

ESE 列类型JET_coltypLongText和JET_coltypLongBinary称为长值列类型。 这些列是大型字符串和大型二进制对象,这些对象可能存储在远离主索引的 B+ 树中。 当长值与主记录分开存储时,这些值在内部键位于长值 ID(LID)和字节偏移量上,并作为流进行访问。 在 调用 JetAddColumn 时,会将长值列添加到表中,JET_COLUMNDEF 结构的 coltyp 成员设置为JET_coltypLongText或JET_coltypLongBinary。 长文本或长二进制列值的最大大小为 2 GB -1。

ESE 支持追加、字节范围覆盖和设置长值列的大小作,以支持这些列类型的高效流实现。 默认情况下,如果长值数据大于 1024 字节,则长值数据存储在单独的 B+ 树中,或者当长值数据存储在记录中时,该记录不适合在单个数据库页上。 应用程序可以选择通过设置选项在记录(JET_bitSetIntrinsicLV)中存储长值数据或强制将它们存储在单独的 B+ 树(JET_bitSetSeparateLV)中来替代默认行为。 这些值是在 jetSetColumn grbit 参数中设置的,或者在调用 JetSetColumns 中使用的 grbit 成员 JET_SETCOLUMN 设置,如下所示:

  • 追加:(JET_bitSetAppendLV)

  • 字节范围覆盖:(JET_bitSetOverwriteLV)

  • 设置大小:(JET_bitSetSizeLV)

  • 强制分离:(JET_bitSetSeparateLV)

  • 存储在记录中: (JET_bitSetIntrinsicLV)

通过指示长值 blob 中的偏移量以及 Blob 中长值数据的长度来设置长值数据。 长值 blob 的偏移量在 JET_SETINFO 结构的 ibLongValue 成员(对于 JetSetColumn)或 JET_SETCOLUMN 结构的 ibLongValue 成员(JetSetColumns) 中设置。 JET_SETCOLUMNpvData 成员,在 对 JetSetColumn 的调用中 pvData 参数包含长值数据。 对长值列的更新必须在事务内执行。

长值数据始终存储在单独的表中,即当应用程序设置JET_bitSetSeparateLV或JET_bitSetIntrinsicLV时,否则会启发式决定。 如果该值大于 1024 字节,或者记录在记录中存储,则 ESE 将存储分隔的长值;如果记录存储在记录中,则记录将不适合在单个数据库页上。

下图显示了存储在单独表中的长值数据。 将长值存储在记录外部时,会创建一个新的长值 ID 来引用其值。 这样,多个记录就可以引用相同的列值。 如果数据中的多个记录指向相同的长值数据,则对数据的引用计数将增加。

ESE_Documentation_longvaluedtree2

ESE 还支持单个实例存储功能,允许多个记录引用相同的大型二进制对象,就像每个记录都有自己的信息副本一样:因此,避免列值数据的副本重复。 此功能在调用 JetPrepareUpdate 时启用,prep 参数中设置JET_prepInsertCopy选项。