不允许表获取大量的扩展数据块,因为所允许的扩展数据块数存在上限。达到此限制值后,尝试添加扩展数据块将在 INSERT 请求之后产生错误 -136(没有更多的扩展数据块)。
-
运行以下 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
-
将表或索引分段的物理地址分割为块号(冒号之前的数字)和页号(冒号右边的最后 5 位),然后运行 oncheck -pP chunk_id:page_id。
在图 1 中,物理地址为 7:711。因此,在以下
oncheck 命令中,chunk_id 是 7,page_id 是 711:
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
-
从 oncheck -pP 的输出中,取 frcnt 列下的数并将其除以 8,以得到可用于该对象的附加扩展数据块数。
在图 2 中的样本 oncheck -pP 中,frcnt 列显示值 1196。以下计算显示了附加扩展数据块数:
Additional_extents = trunc (frcnt / 8)
= trunc (1196 / 8)
= 149
-
要得到扩展数据块数的最大值,请将 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 次就会将下一扩展数据块的大小加倍。
- 数据库服务器创建一个与先前扩展数据块相邻的扩展数据块时,它会将这两个扩展数据块视为单个扩展数据块。