oracle - 使用闪存盘存储还需要担心行碎片吗?

标签 oracle fragmentation solid-state-drive database-fragmentation

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

最佳答案

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

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

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

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

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

关于oracle - 使用闪存盘存储还需要担心行碎片吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20193081/

相关文章:

sql - 如何在plsql函数中调用函数

oracle - 系统用户密码已过期

oracle select into variable 当 select 什么都不返回时?

java - 使用 JPA 提高 foreach 持久调用的性能

java - 使用 YoKeyword 进行 fragment 化

h.264 - RTP 分片与 UDP 分片

filesystems - 什么是 Google 文件系统中的惰性空间分配

c++ - 在 C++ 中快速编写许多大文件

使用快速磁盘存储 (SSD) 进行优化的算法?

java - 我们如何将文件从受密码保护的 RAR/ZIP 中提取到 SSD 卡中或直接提取到字符串中?