【问题标题】:How to enable in-rows (LOB ) storage in Sybase and when to consider enabling it?如何在 Sybase 中启用行内 (LOB) 存储以及何时考虑启用它?
【发布时间】:2018-11-06 19:37:28
【问题描述】:

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

谁能解释一下:

-如何在数据库上启用此功能?是否使用 create table 命令启用?还是修改表?

-如何检查它是否启用?

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

-为什么文本/图像数据类型可能会导致锁定/阻塞并且启用行内会删除它?

【问题讨论】:

    标签: sybase sap-ase


    【解决方案1】:

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

    alter table tablename modify mycol in row (500)

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

    启用它会显示在 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,从而提高性能。

    【讨论】:

    • 在首先检查适用性方面,您可以运行 select max(datalength(<col_name>)),avg(datalength(<col_name>)) from table_name 之类的命令来获取文本列的最大和平均大小。如果与页面大小相比,您的平均值较低,那么这是行内 lob 的良好候选者。如果最大值远低于您的页面大小,那么您可能需要进一步检查以查看高于平均值的行百分比,并调整行内 lob 设置的大小以尽可能多地获取行内数据。
    • 感谢您的帮助,另一个问题是在第 500 行和第 1000 行申请有什么区别?我知道它需要不到 500 但即使我增加了,也会有同样的影响吗?
    • 唯一的区别是具有> 500字节文本/图像数据的行将像以前一样在第一个设置和> 1000字节的第二个设置下存储在行外。这就是为什么检查每个表并验证它是否是一个好的候选人是关键的原因。例如,当使用行内 lob 时,我已经看到将 20GB 的交易表增加到 500MB。这是因为文本列中 99% 的数据是单个空格字符,因为它们使文本列不可为空,因此我将行内设置设置为 100 字节,这很容易覆盖了 99% 的数据并节省了大量实例上有 8k 个页面。
    猜你喜欢
    • 2018-02-22
    • 1970-01-01
    • 2018-11-01
    • 1970-01-01
    • 2019-03-18
    • 2014-09-06
    • 2011-07-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多