3

我正在尝试为需要对读者提供高可用性的数据库创建数据导入机制,同时按计划提供不规则的大量新数据负载。

新数据仅涉及三个表,其中添加了新数据集以及它们引用的许多新数据集项以及引用这些的一些数据集项元数据行。数据集可能有数以万计的数据集项。

数据集项在多个列组合上被大量索引,绝大多数(但不是全部)读取包括 where 子句中的数据集 id。由于索引,数据插入现在太慢而无法跟上流入但由于这些索引的读者优先,我无法删除主表上的索引,但需要处理副本。

因此,我需要某种工作表,在快速切换它成为查询表/视图的一部分之前,我需要复制、插入和重新索引。问题是如何快速执行该切换?

我已经研究过通过一系列数据集 id 对数据集项目表进行分区,这是一个外键,但是因为这不是主键的一部分,所以 SQL Server 似乎并不那么容易。我无法使用易于索引的更新版本切换旧数据分区。

不同的文章建议使用分区、快照隔离和分区视图,但没有一个直接回答这种情况,要么是关于批量加载和归档旧数据(按日​​期分区),要么是不考虑索引的简单事务隔离。

有没有直接解决这个看似常见问题的例子?

当将新数据批量加载到大型索引表中时,人们有哪些不同的策略来真正最大限度地减少禁用索引的时间?

4

1 回答 1

1

请注意,对列进行分区要求该列是聚集索引键的一部分,而不是主键的一部分。两者是独立的。

尽管如此,分区对您可以在表上执行的操作施加了很多限制。例如,仅当所有索引都对齐并且没有外键引用正在修改的表时,切换才有效。

如果您可以在所有这些限制下使用分区,这可能是最好的方法。分区视图为您提供了更大的灵活性,但也有类似的限制:所有索引显然都是对齐的,并且传入的 FK 是不可能的。

对数据进行分区并不容易。它不是一个点击向导并完成的解决方案。这组权衡非常复杂。

于 2012-08-13T11:56:16.257 回答