2

在为表列选择 char/varchar2 数据类型、在表上发布批量删除/插入/更新时,行碎片始终是您需要考虑的事情,因为 Oracle 试图将新数据放入打开的空闲空间中,因此碎片可能开始变慢在某个时候降低性能。现在一切都随着闪存盘而改变了,因为闪存技术本身的原因,数据被尽可能多地碎片化写入。如果我们不需要关心碎片,那么它就会破坏对表数据存储问题和数据碎片的整体理解。有没有人有将数据库文件存储在闪存磁盘上的经验?ssd磁盘的碎片问题是否消失了?

4

1 回答 1

4

正如您所描述的那样,没有“行碎片”之类的东西,实际上,它永远不应该驱动您对数据类型的char选择。varchar2您选择的数据类型应取决于数据的性质以及它是真正的固定宽度还是可变宽度。99.9% 的情况下,您应该更喜欢varchar2.

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

在一个区块内,Oracle 为未来的增长预留了一定的空间。这由PCTFREE表的设置控制。如果您希望您的行会随着时间的推移而大幅增长,您将使用一个大的PCTFREE. 如果您希望您的行的大小随着时间的推移是静态的,您可以使用一个小的PCTFREE. 您不想调整数据类型以防止行大小发生变化,而是希望调整表格PCTFREE以适应您期望的任何变化。

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

Regardless of the storage system, you want to set the PCTFREE of your table appropriately so that you minimize the amount of row migration that takes place over time (there are other ways to minimize row migration in some corner cases but 99% of the time you really just want to set the PCTFREE correctly). Use the appropriate data types for the data that you're trying to store, don't let concern about row migration influence your choice of data types.

于 2013-11-25T19:15:40.200 回答