你所描述的并没有“行碎片”这样的东西,而且实际上,它永远不会驱动你的选择 char 要么 varchar2 数据类型。您对数据类型的选择应取决于数据的性质以及它是否是固定宽度或可变宽度。 99.9%的时间,你应该更喜欢 varchar2 。
char
varchar2
Oracle可能读取或写入的最小I / O单元是块。块通常为8k(尽管它可以小到2k或大到32k)。块通常存储多行的数据。由于Oracle每次都必须写入整个块,因此它是否必须在块内移动数据并不重要。
在一个区块内,Oracle为未来增长预留了一定的空间。这是由控制 PCTFREE 表的设置。如果您希望您的行会随着时间的推移而显着增长,那么您将使用大量的行 PCTFREE 。如果您希望您的行在一段时间内是静态的,那么您可以使用小行 PCTFREE 。您不希望调整数据类型以防止行的大小发生变化,您需要调整表格 PCTFREE 适合您期望的任何变化。
PCTFREE
如果Oracle在某个特定行的块上空间不足(例如,如果该行需要增长而且需要增长 PCTFREE 设置得太小),Oracle需要将行迁移到新块。这意味着它在原始块中留下指向新块的指针并将实际数据移动到新块。这可能会产生性能问题,因为您现在必须访问旧块和新块以读取行,如果您正在读取索引,具体取决于表中行的哪些部分被迁移。如果您的行大于您的块或行数超过255列,迫使Oracle执行额外的I / O,那么您也可能会遇到链接行的问题但这些似乎不是您关注的问题。
无论存储系统如何,您都要设置 PCTFREE 适当的表,以便最大限度地减少随时间发生的行迁移量(在某些极端情况下还有其他方法可以最小化行迁移,但99%的时间你真的只想设置 PCTFREE 正确)。对您尝试存储的数据使用适当的数据类型,不要担心行迁移会影响您选择的数据类型。