我正在使用 SQL Server 2008 中的一个大表(约 100.000.000 行)。我经常需要在该表中添加和删除约 30.000.000 行的批次。目前,在将大批量加载到表中之前,我禁用索引,插入数据,然后重建索引。我测量这是最快的方法。
从最近开始,我正在考虑在这个表上实现表分区以提高速度。我将根据我的批次对表进行分区。
我的问题是,是否可以禁用一个特定分区的索引,并在再次启用之前将数据加载到该分区中?在这种情况下,我的表的其余部分将不必遭受完整的索引重建,并且我的加载可以更快?
我正在使用 SQL Server 2008 中的一个大表(约 100.000.000 行)。我经常需要在该表中添加和删除约 30.000.000 行的批次。目前,在将大批量加载到表中之前,我禁用索引,插入数据,然后重建索引。我测量这是最快的方法。
从最近开始,我正在考虑在这个表上实现表分区以提高速度。我将根据我的批次对表进行分区。
我的问题是,是否可以禁用一个特定分区的索引,并在再次启用之前将数据加载到该分区中?在这种情况下,我的表的其余部分将不必遭受完整的索引重建,并且我的加载可以更快?
索引通常位于分区方案上。对于您正在谈论的场景,您实际上可以使用批处理(相同的结构,不同的名称)加载一个新表,然后使用 SWITCH 命令将此表作为新分区添加到现有表中。
我已经包含了我用来执行此操作的代码,您需要根据您的表名对其进行修改:
DECLARE @importPart int
DECLARE @hourlyPart int
SET @importPart = 2 -- always, so long as the Import table is only made up of 1 partition
-- get the Hourly partition
SELECT
@hourlyPart = MAX(V.boundary_id) + 1
FROM
sys.partition_range_values V
JOIN sys.partition_functions F
ON V.function_id = F.function_id
AND F.name = 'pfHourly'
ALTER TABLE Import
SWITCH PARTITION @importPart
TO Hourly PARTITION @hourlyPart;