【问题标题】:SQL Server 2008: Disable index on one particular table partitionSQL Server 2008:在一个特定的表分区上禁用索引
【发布时间】:2010-05-05 11:30:58
【问题描述】:

我正在使用 SQL Server 2008 中的一个大表(约 100.000.000 行)。我经常需要在此表中添加和删除约 30.000.000 行的批次。目前,在将大批量加载到表中之前,我禁用索引,插入数据,然后重建索引。我测出这是最快的方法。

从最近开始,我正在考虑在这个表上实现表分区以提高速度。我将根据我的批次对表进行分区。

我的问题,是否可以禁用一个特定分区的索引,并在再次启用之前将数据加载到该分区中?在这种情况下,我的表的其余部分就不必进行完整的索引重建,而且我的加载速度可以更快?

【问题讨论】:

标签: sql-server-2008 database-design indexing etl partitioning


【解决方案1】:

索引通常位于分区方案上。对于您正在谈论的场景,您实际上可以使用批处理加载一个新表(相同的结构,不同的名称),然后使用 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;

【讨论】:

  • 是的,我会删除以前的分区,包括它的索引并添加新的分区,然后它会自动包含在索引中。感谢您的回答:)
猜你喜欢
  • 2011-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-12
  • 1970-01-01
  • 2012-05-03
相关资源
最近更新 更多