如何在Sybase中启用行内(LOB)存储以及何时考虑启用它?

时间:2018-11-06 09:58:43

标签: sybase sybase-ase

在对sybase ase 15.7中的in-rowoff-row功能进行了一些研究后,我在包含IMAGE和TEXT列的表中有一些块(类似于此SO question)可以改善性能(如果逻辑存储区中的大小小于4k,则LOB数据将与表值的同一页(即行more info here)一起放置。

任何人都可以解释:

-如何在数据库上启用此功能?使用create table命令启用了它吗?或更改表?

-如何检查其是否启用?

-为什么它可能减少或移除块?

-为什么Text / image数据类型可能会导致锁定/阻止,并且启用行将其删除?

1 个答案:

答案 0 :(得分:2)

您必须通过针对现有表的列的alter table启用每个列的选项,或者如果它是针对该列的新表,则可以设置该选项:

alter table tablename modify mycol in row (500)

这里我说过,任何少于500字节长度的列都将存储在行中,任何超出该长度的内容将存储在行外(旧的默认行为)。这样可以大大缩小表的大小,因为在表中有很多非常小的text / image列和很大的页面,因为这样可以避免浪费文本链中每行的整个页面。

启用后,它将在sp_help输出中的列上显示。要检查是否有好处,您需要考虑:

  1. 您的Sybase数据服务器页面大小(较大的页面大小会浪费每个文本链页面的空间)
  2. “文本/图像”列中数据的平均大小,数据越小,使用行内LOB带来的好处就越大。如果所有数据都大于数据服务器的页面大小,那么将不会有任何好处,因为数据仍将像更改前一样在行外存储。

您必须将数据重新加载到表中才能使更改生效,因此可以通过选择进入(以创建表和数据的新副本)或通过BCP输出/输入来实现。

此处的Sybase文档中有更多信息:

http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.infocenter.dc32300.1570/html/sqlug/CHECDADI.htm

在阻塞方面,数据符合条件并保存在行中,将从表本身而不是从文本链读取数据,而文本链实际上是表末尾的一大堆数据。您还可以从表大小上节省大量空间(这取决于数据大小),从而减少IO,从而提高性能。