2013-11-25 48 views
2

行碎片始终是您在为表列选择char/varchar2数据类型时需要考虑的事情,因为Oracle会尝试将新数据放入打开的空闲空间中,因此可能会开始碎片化,从而在表上发出批量删除/插入/更新在某个时间放慢表现。现在,随着闪存存储磁盘的发展,所有内容都发生了变化,因为由于闪存技术本身的原因,数据的写入尽可能分散。如果我们不需要关心碎片,那么它会破坏关于表格数据存储问题和数据碎片的整体理解。有没有人有将数据库文件存储在闪存存储磁盘上的经验?碎片问题是否随ssd磁盘一起消失?使用闪存存储时,我们是否仍然需要担心行碎片?

回答

4

没有像描述它的“行碎片”这样的事情,而且实际上,它决不应该驱动您选择的数据类型charvarchar2。您选择的数据类型应该取决于数据的性质以及它是否真的是固定宽度或可变宽度。 99.9%的时间,你应该更喜欢varchar2

Oracle可以读取或写入的最小单元是块。一个块通常是8k(尽管它可以小到2k或32k大)。一个块通常会存储多行数据。由于Oracle每次都必须编写整个块,因此它是否必须在块内移动数据并不重要。

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

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

不管存储系统如何,您都希望适当地设置表格的PCTFREE,这样可以最大限度地减少发生的行迁移量(还有其他方法可以最大限度地减少某些转角情况下的行迁移,但是99%的时候你真的只是想正确设置PCTFREE)。针对您要存储的数据使用适当的数据类型,不要担心行迁移会影响您选择的数据类型。

+0

我猜自动段存储管理(ASSM)自动管理PCTFREE,所以在使用旧型MSSM存储类型时需要设置PCTFREE吗? – Centurion

+1

@Centurion - No. ASSM自动处理手动段空间管理中由'PCTUSED'参数处理的内容。这两种类型的表空间都依赖于表的“PCTFREE”设置。自动管理'PCTFREE'是非常困难的,因为系统无法知道行的大​​小如何随时间变化 - 这只是数据建模者最初知道的。 –

相关问题