在文档的任何地方,Microsoft 都建议我们尽可能始终使用 CTAS。
我正在为 ADW 构建数据摄取流程。这个进程可能会收到我们想要从目标表中删除的数据。但是,为了使用 CTAS,我们必须重命名表。
但是,如果该表中有一个长时间运行的查询怎么办。我注意到重命名锁定并等待查询结束。
这让事情变得很困难,因为当我有一个 10 亿行的表时,sql 删除执行得非常糟糕,并且重命名会被锁定,直到查询完成。
有没有更好的方法来解决这个问题?
在文档的任何地方,Microsoft 都建议我们尽可能始终使用 CTAS。
我正在为 ADW 构建数据摄取流程。这个进程可能会收到我们想要从目标表中删除的数据。但是,为了使用 CTAS,我们必须重命名表。
但是,如果该表中有一个长时间运行的查询怎么办。我注意到重命名锁定并等待查询结束。
这让事情变得很困难,因为当我有一个 10 亿行的表时,sql 删除执行得非常糟糕,并且重命名会被锁定,直到查询完成。
有没有更好的方法来解决这个问题?
微软推荐的所有选项都不能满足我的要求(重命名、表切换和分区切换)。
这主要是因为我希望数据仓库尽快包含重要信息,而且我不能等到表中运行的每个查询完成才能最终进行摄取。在生产中,预计会有很多长时间运行的查询。
因为 DW 对实际 DELETE 操作的删除选项非常有限,所以我决定通过更改表来解决这些限制,以满足 DELETE 操作的要求。
因此,为了实现这一目标,我决定执行以下操作:
摄取过程中的所有删除操作如下所示:
DELETE FROM [{schemaName}].[{tableName}] WHERE [{hashColumnName}] in (SELECT [{hashColumnName}] FROM {stagingTableName})
通过这些更改,我设法为每日传入的数据实现了令人满意的摄取速度。当然,在摄取大量数据时,它比任何微软的建议都要慢。
在我的测试中,我可以在 DW 300 中实现每分钟 450k 行,并且在摄取代码中仍有许多改进需要完成。
希望我有帮助!
过了一会儿,我找到了这个链接: UPDATE FROM in Azure SQL DW?
我不知道我可以像下面那样使用 delete 并且有了这个,解决方案最终变得更容易,因为我不再需要创建哈希列。
DELETE a
WHERE EXISTS (
SELECT TOP 1 1
FROM b AUX
WHERE AUX.b2 = a.a2
)
我不知道这会表现得如何。