考虑扩展数据块数的上限

不允许表获取大量的扩展数据块,因为所允许的扩展数据块数存在上限。达到此限制值后,尝试添加扩展数据块将在 INSERT 请求之后产生错误 -136(没有更多的扩展数据块)。

要确定表所允许的扩展数据块数的上限:

  1. 运行以下 oncheck 选项,以得到 您想为之计算扩展数据块数目限制的对象(表或索引分段)的物理地址。
    oncheck -pt databasename:tablename 
    

    图 1 显示 oncheck -pt 的样本输出。

    图: oncheck -pt 输出

    TBLspace Report for stores7:wbyrne.sfe_enquiry 
    Physical Address 7:711
    Number of special columns 18 
    Number of keys 0 
    Number of extents 65 
    Number of data pages 960 
    
  2. 将表或索引分段的物理地址分割为块号(冒号之前的数字)和页号(冒号右边的最后 5 位),然后运行 oncheck -pP chunk_id:page_id

    图 1 中,物理地址7:711。因此,在以下 oncheck 命令中,chunk_id7page_id711

    oncheck -pP 7:711 

    图 2 显示此命令的样本输出。

    图: oncheck -pP chunk# page# 输出

    addr   stamp  nslots flag type  frptr frcnt next prev 
    7:711 112686 5      2    PARTN 828   1196  0    0
    slot ptr len flg 
    1     24  92   0 
    2    116  40   0 
    3    156 144   0 
    4    300   0   0 
    5    300 528   0
    
  3. oncheck -pP 的输出中,取 frcnt 列下的数并将其除以 8,以得到可用于该对象的附加扩展数据块数。

    图 2 中的样本 oncheck -pP 中,frcnt 列显示值 1196。以下计算显示了附加扩展数据块数:

    Additional_extents = trunc (frcnt / 8)
                                          = trunc (1196 / 8)
                                          = 149
    
  4. 要得到扩展数据块数的最大值,请将 oncheck -pt 输出的 Number of extents 行中的值加到 Additional_extents 值,如以下公式所示:
    Maximum_number_extents = Additional_extents + 
          Number_of_extents
    

    图 1中的样本 oncheck -pt 中,Number of extents 行显示值 65。以下计算显示了此表的最大扩展数据块数:

    Maximum_number_extents = 149 + 65 = 214
    
为了确保不超过限制值,数据库服务器会执行以下操作:
  • 在每次创建扩展数据块时,数据库服务器均会检查扩展数据块的数量。如果正在创建的扩展数据块的数目为 16 的倍数,数据库服务器会自动为表将下一扩展数据块大小进行加倍。 因此,在创建扩展数据块时,数据库服务器每 16 次就会将下一扩展数据块的大小加倍。
  • 数据库服务器创建一个与先前扩展数据块相邻的扩展数据块时,它会将这两个扩展数据块视为单个扩展数据块。