我正在重新构造数据库中的一个表,将一个BLOB列从一个表移动到另一个表。此表有300GB的BLOB数据。数据库服务器具有磁盘空间限制,因此在迁移期间没有足够的空间用于数据副本。有没有什么方法可以将数据直接移动到另一个表中,而不复制信息?比如只复制对BLOB字段的内存位置的引用,而不必复制数据?这些表位于同一个表空间中。
pxiryf3j1#
我能想到的唯一选择是分批“移动”斑点,而不是一次全部移动。您可能会尝试从一个表复制一些(例如100)行/列到另一个表,然后将blob列设置为null或从原始表中删除该列,并在继续下一批仍需要复制的行之前提交此批。理论上,这只需要每个批处理中的blob空间的两倍,但实际上这取决于Oracle如何管理插入和删除。请注意,在Oracle数据库中,当不再需要BLOB或从表中删除BLOB时,列占用的空间不会立即释放或释放。相反,该空间被标记为可供重用。这种行为被称为“空间重用”或“空间回收”。如果在执行大规模删除或更新后需要显式回收BLOB列中的空间,可以使用ALTER TABLE ... SHRINK SPACE。
ALTER TABLE ... SHRINK SPACE
1条答案
按热度按时间pxiryf3j1#
我能想到的唯一选择是分批“移动”斑点,而不是一次全部移动。您可能会尝试从一个表复制一些(例如100)行/列到另一个表,然后将blob列设置为null或从原始表中删除该列,并在继续下一批仍需要复制的行之前提交此批。
理论上,这只需要每个批处理中的blob空间的两倍,但实际上这取决于Oracle如何管理插入和删除。
请注意,在Oracle数据库中,当不再需要BLOB或从表中删除BLOB时,列占用的空间不会立即释放或释放。相反,该空间被标记为可供重用。这种行为被称为“空间重用”或“空间回收”。
如果在执行大规模删除或更新后需要显式回收BLOB列中的空间,可以使用
ALTER TABLE ... SHRINK SPACE
。