无法理解oracle中的INITRANS

joe*_*joe 3 oracle

我需要计算表空间大小,部分计算需要 INITRANS 的值,我不完全理解,我不确定是否应该使用默认值 2。

我的业务规则指定数据从多达 50 个不同的位置插入,所以我假设一些并发,这是否表明我应该使用 50 的 INITRANS 还是我误解了 INITRANS 是什么?

Bal*_*app 9

一如既往:这取决于。然而,在大多数情况下,默认值就足够了。

仅处理 50 个并发插入(事务)的业务需求并不意味着需要设置 INITRANS 50。它们真的是并发的吗?交易的持续时间是否会相互重叠,因此它们真的同时发生?所有的50?

INITRANS 指定数据库块中事务槽(ITL 槽)的最小数量。当然,如果需要,ITL 插槽的数量可以增加,由数据库管理。最大数量取决于数据库块大小(因为不允许 ITL 条目占据数据库块的 50% 以上,并且 1 个 ITL 条目需要 24 个字节)和 MAXTRANS(从 10.2 版开始为 255)。

因此,如果:

  1. 所有新数据最终都在同一个数据库块中(不一定是一个表,一个常见的例子是 ID 列上的 PK 索引,其中 ID 值来自一个序列)
  2. 更改不会立即(或足够快)提交,因此锁将被持有很长时间,并且所有 50 个会话将同时持有锁

那么是的,数据库块将需要 50 个 ITL 插槽。但即便如此,您很可能也不需要将 INITRANS 设置为 50,因为数据库会自动管理它,而 50 远低于标准 8K 数据库块中的实际限制。

对于DELETEUPDATESELECT ... FOR UPDATE,这可能不是真的,因为当它们发生时,数据库块很可能已满,并且在这种情况下 ITL 插槽的数量可能不会增加。想象一个完整的数据库块,它存储 50 行并有 2 个 ITL 槽,50 个并发事务想要用SELECT ... FOR UPDATE. 但是INSERT对于使用空数据库块或继续写入其中有可用空间的现有块的 , 这应该不是问题。

请注意,这里有很多 ifs、mays 和问题,正如我所说,在大多数情况下,默认值就足够了。是的,我可以创建一个像上面一样工作的人工示例,但幸运的是,实际场景是不同的。