我有一张很大的桌子。我想分区它,但我不能。
数据库大小:1TB,可用空间 200GB
桌子:
- 大小:165 列(行长 4216 KB,无 LOB),5 亿行,600GB 数据。
- 可能的分区:每个分区一天
- 每天/分区的行数:200万
为了对其进行分区,我需要创建一个聚集索引。但是创建分区需要和表一样大小的空闲空间,我没有多余的600GB。
有什么选项可以对这张表进行分区吗?
编辑1:
我尝试将数据复制到单独的表中。
但是,当我尝试DELETE
(或INSERT
)将 1 天的数据放入另一个表时,我收到一个错误,即事务日志已满并且我的事务正在回滚。我的事务日志大约是 20 GB,我不能让它变得更大。
您需要创建一个具有相同架构但作为分区对象的新表。或者,您可以压缩表格以节省更多空间。由于您平均每页仅放置一行,因此我不确定您会看到多少空间节省。我建议将几千行放入新表中,然后进行压缩以查看节省的空间是否值得 CPU 开销。
至于如何在不占用所有驱动器空间和不膨胀事务日志的情况下移动这么多数据,则需要在每次运行时循环移动少量数据。您需要进行一些数据分析以查看您可以处理多大的窗口,但我假设根据数据量您需要一次移动一分钟的行。
当一切都完成并且您已经验证所有数据都在新表中时,删除旧表并重命名新表,使其具有旧表名称。这样什么都不会破坏。您需要编写旧表(如果有)上的权限,以便您可以将它们应用于新表。
如果此表有带有外键的表,您需要先删除它们,然后才能使用。