在 SQL 带有临时表的服务器中批量加载之前删除索引?

Dropping Indices Before Bulk Load in SQL Server with Temporal Tables?

我在 SQL Server 2017 中工作,我正在尝试使用时间 tables,以便我可以跟踪数据的历史变化。我以前从未使用过时间 tables,但我过去使用传统 tables 创建了许多 ETL 过程,并且正在尝试了解如何优化将数据加载到最终 [=16] =].传统上,当我写我的 ETL 时(当我说传统时,我的意思是当我不使用时间 tables 时),为了提高性能,我通常会删除我的 tables 上的所有索引,然后批量加载我在最终 table 中拥有的 1000 万条左右的记录,当加载完成时,我将索引重新应用到 table。

我想知道我是否可以用时间 tables 来做这件事?似乎在使用临时 tables 加载或更新数据时我需要有一个主键以保留 tables 的历史记录。但是,如果我无法删除索引,那么在批量加载时我的性能似乎会受到影响,对吗?如果在使用时间 table 历史记录时不能删除索引,我该如何减少加载 table 的时间?

系统版本 table 不需要匹配主 table 上的索引。您可以在要插入记录的 table 上安全地 delete/disable 非聚集索引。您也可以查看 requirements

临时 table 对于某些场景很有用,但我没有在 ETL 过程中使用它们。检查 column-store indexes 可能更好。如果您使用列存储索引创建历史记录 table,您可以选择归档压缩。然后,只用 batch ID 插入新的 1000 万。数据足迹将非常小。

当然,如果你需要经常查询历史table并且使用system-versioning特殊语法,使用列存储可能会影响性能。