如何在 ADW 中将 CTAS 与并发查询一起使用

How to use CTAS with concurrent queries in ADW

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

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

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

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

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

Microsoft 推荐的

None 选项有助于满足我的要求(重命名、Table 开关和分区开关)。

这主要是因为我希望数据仓库尽快包含重要信息,而且我也等不及 table 中的每个查询 运行 都完成了做摄取。在生产中,预计会有很多长 运行 查询。

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

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

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

    从 [{schemaName}].[{tableName}] 中删除 [{hashColumnName}] 在 ( SELECT [{hashColumnName}] 来自 {stagingTableName} )

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

在我的测试中,我可以在 DW 300 中实现每分钟 450k 行,并且在摄取代码方面还有很多改进工作要做。

希望对您有所帮助!

过了一会儿,我发现了这个link:

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

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

我不知道这会有多好。