1

在文档的任何地方,Microsoft 都建议我们尽可能始终使用 CTAS。

我正在为 ADW 构建数据摄取流程。这个进程可能会收到我们想要从目标表中删除的数据。但是,为了使用 CTAS,我们必须重命名表。

但是,如果该表中有一个长时间运行的查询怎么办。我注意到重命名锁定并等待查询结束。

这让事情变得很困难,因为当我有一个 10 亿行的表时,sql 删除执行得非常糟糕,并且重命名会被锁定,直到查询完成。

有没有更好的方法来解决这个问题?

4

2 回答 2

0

微软推荐的所有选项都不能满足我的要求(重命名、表切换和分区切换)。

这主要是因为我希望数据仓库尽快包含重要信息,而且我不能等到表中运行的每个查询完成才能最终进行摄取。在生产中,预计会有很多长时间运行的查询。

因为 DW 对实际 DELETE 操作的删除选项非常有限,所以我决定通过更改表来解决这些限制,以满足 DELETE 操作的要求。

因此,为了实现这一目标,我决定执行以下操作:

  1. 向所有表添加一个新列,其中该列是表的“PK”列的哈希(这些列在一起,使行具有唯一性)
  2. 使用散列列上的分布创建所有表
  3. 在聚集列存储表上,按其“PK”列对聚集列存储索引进行排序
  4. 摄取过程中的所有删除操作如下所示:

    DELETE FROM [{schemaName}].[{tableName}] WHERE [{hashColumnName}] in (SELECT [{hashColumnName}] FROM {stagingTableName})

通过这些更改,我设法为每日传入的数据实现了令人满意的摄取速度。当然,在摄取大量数据时,它比任何微软的建议都要慢。

在我的测试中,我可以在 DW 300 中实现每分钟 450k 行,并且在摄取代码中仍有许多改进需要完成。

希望我有帮助!

于 2019-12-10T22:55:38.383 回答
0

过了一会儿,我找到了这个链接: UPDATE FROM in Azure SQL DW?

我不知道我可以像下面那样使用 delete 并且有了这个,解决方案最终变得更容易,因为我不再需要创建哈希列。

DELETE a
WHERE EXISTS (
        SELECT TOP 1 1
        FROM b AUX
        WHERE AUX.b2 = a.a2
        )

我不知道这会表现得如何。

于 2019-12-17T23:28:01.567 回答