【问题标题】:Dropping Indices Before Bulk Load in SQL Server with Temporal Tables?在带有临时表的 SQL Server 中批量加载之前删除索引?
【发布时间】:2020-06-16 05:23:07
【问题描述】:

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

我想知道是否可以使用临时表进行此操作?在使用临时表加载或更新数据时,为了保留表的历史记录,似乎我需要有一个主键。但是,如果我无法删除索引,那么在批量加载时我似乎会受到性能影响,对吧?如果在使用临时表历史记录时无法删除索引,如何减少加载表的时间?

【问题讨论】:

    标签: sql-server indexing sql-server-2017 temporal temporal-tables


    【解决方案1】:

    系统版本表不需要匹配主表上的索引。您可以安全地删除/禁用要插入记录的表上的非聚集索引。您也可以查看requirements

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

    当然,如果你需要经常查询历史表并使用system-versioning特殊语法,使用column-store可能会影响性能。

    【讨论】:

      猜你喜欢
      • 2011-02-08
      • 2012-10-17
      • 1970-01-01
      • 1970-01-01
      • 2011-08-21
      • 1970-01-01
      • 2010-10-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多