在分区级别删除索引

时间:2009-09-02 14:16:05

标签: sql-server indexing

您知道在SQL Server(2008)中是否有任何方法可以做到这一点?

我正在开发一个DataWarehouse加载过程,所以我想要做的是删除正在加载的分区的索引,以便我可以执行快速批量加载,然后我可以在分区级别再次重建索引。

我认为在Oracle中可以实现这一点,但可能不在SQL Server中。

感谢, 维克多

2 个答案:

答案 0 :(得分:1)

不,您不能仅删除单个分区的表索引。但是,SQL 2008提供了一种批量加载方法,包括在同一文件组的单独分区上设置具有完全相同模式的第二个表,加载它,精确地索引它,然后“切换”新分区生产表上的现有空分区。

但这是一个高度简化的描述。以下是SQL 2008关于实现此目的的MSDN文章: http://msdn.microsoft.com/en-us/library/ms191160.aspx

答案 1 :(得分:0)

我知道在SQL 2005中这是不可能的。我没有听说过任何可以让你在2008年做到这一点的事情,但它可能就在那里(我已经阅读但尚未使用它)。我能得到的最接近的是禁用索引,但如果禁用聚簇索引,则无法再访问该表。不是那么有用,imho。

我的Warehouse ETL项目的解决方案是创建一个列出所有索引和索引约束(PK,UQ)的表。在ETL期间,我们遍历表(对于正在加载的所需表集),删除索引/索引约束,加载数据,然后再次遍历表并重新创建索引/约束。有点丑陋,有点尴尬,但一旦运行它不会破坏 - 并具有新建索引的附加优势(即没有碎片,fillfactor可以是100)。添加/修改/删除索引也很尴尬,但并不是那么难。

您可以动态执行此操作 - 从目标表中读取并存储索引/约束定义,删除它们,加载数据,然后从存储的数据中动态构建和运行(重新)创建脚本。但是,如果在运行期间出现问题,那么你已经死了。 (这就是我选择永久牌桌的原因。)

我发现这对表分区非常有用,因为你在“加载”表上做了所有的工作,而live(dbo,对我们来说)表是不受影响的。