使用闪存磁盘存储时,我们是否还需要担心行碎片问题?

时间:2013-11-25 12:27:04

标签: oracle fragmentation ssd database-fragmentation

在为表列选择char / varchar2数据类型时,需要考虑行碎片,在表上发出批量删除/插入/更新,因为Oracle会尝试将新数据放入打开的可用空间中,因此可能会出现碎片在某个时候开始减慢性能。现在闪存存储磁盘已经发生了一些变化,因为闪存技术本身的数据写得尽可能多。如果我们不需要关注碎片,那么它就会破坏对表数据存储问题和数据碎片的整体理解。有没有人有将数据库文件存储在闪存盘上的经验? ssd磁盘的碎片问题是否已经消失?

1 个答案:

答案 0 :(得分:4)

没有像您描述的那样“行碎片”这样的东西,而且实际上,永远不应该选择charvarchar2数据类型。您对数据类型的选择应取决于数据的性质以及它是否是固定宽度或可变宽度。 99.9%的情况下,您应该更喜欢varchar2

Oracle可能读取或写入的最小I / O单元是块。块通常为8k(尽管它可以小到2k或大到32k)。块通常存储多行的数据。由于Oracle每次都必须编写整个块,因此无论是否必须在块内移动数据都无关紧要。

在一个区块内,Oracle为未来增长预留了一定的空间。这由表的PCTFREE设置控制。如果您希望自己的行会随着时间的推移而显着增长,那么您将使用较大的PCTFREE。如果您希望自己的行在一段时间内保持不变,那么您将使用较小的PCTFREE。您不希望调整数据类型以防止行的大小发生变化,您需要调整表的PCTFREE以适合您期望的任何更改。

如果Oracle在特定行的块上空间不足(例如,如果行需要增长并且PCTFREE设置得太小),Oracle需要将该行迁移到新块。这意味着它在原始块中留下指向新块的指针并将实际数据移动到新块。这可能会产生性能问题,因为您现在必须访问旧块和新块以读取行,如果您正在读取索引,具体取决于表中行的哪些部分被迁移。如果您的行大于您的块或行数超过255列,迫使Oracle执行额外的I / O,那么您也可能会遇到链接行的问题但这些似乎不是您关注的问题

无论存储系统如何,您都希望适当地设置表的PCTFREE,以便最大限度地减少随时间发生的行迁移量(在某些极端情况下还有其他方法可以最小化行迁移但99%的时间你真的只想正确设置PCTFREE。对您尝试存储的数据使用适当的数据类型,不要担心行迁移会影响您选择的数据类型。