从内存优化 table 插入到物理 table

Insert from memory optimized table to physical table

想象一下 SQL Server 2016 中的这种情况:我们必须 tables A 和 B

我们连接 A 和 B,但没有任何反应,1000 行在最短时间内返回。 但是当我们想将这个结果集插入到另一个table(内存优化table OR 正常table 甚至临时table)时,它需要10 20 秒插入。

有什么想法吗?

更新:添加了正常场景和内存优化的执行计划table

当 DML 语句以 Memory-Optimized table 为目标时,查询不能 运行 并行,服务器将采用序列化计划。因此,您的第一个语句 运行s 处于 single-core 模式。

在第二种情况下,DML 语句利用了 "SELECT INTO / FROM" 是可并行化的这一事实。此行为是在 SQL Server 2014 中添加的。因此,您可以获得一个并行计划。以下是有关此的一些信息:

参考: What's New (Database Engine) - SQL Server 2014

我已经 运行 无数次以 Memory-Optimized 为目标解决这个问题。我发现的一种解决方案是,如果 I/O 对检索的要求很高,则将 SELECT 语句的结果暂存到临时 table 或其他中间位置,然后从那里插入进入 Memory-Optimized table.

第三个问题是,默认情况下,仅从 Memory-Optimized table 读取的语句,即使 table 不是 DML 的目标,也是 运行 以序列化的方式。有一个针对此问题的修补程序,您可以使用查询提示启用它。

提示是这样使用的: OPTION(HINT USE ('ENABLE_QUERY_OPTIMIZER_HOTFIXES'))

参考: Update enables DML query plan to scan query memory-optimized tables in parallel in SQL Server 2016

在任何一种情况下,任何以 memory-optimized table 作为目标的 DML 都将在单个核心上 运行。这是设计使然。如果您需要利用并行性,如果 Memory-Optimized table 是语句的目标,则无法执行此操作。您需要对不同的方法进行基准测试,以找到最适合您的方案的方法。