从内存优化表插入物理表

时间:2017-07-11 05:33:16

标签: sql-server memory-optimized-tables

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

  • A 是内存优化表
  • B 是普通表格

我们加入A和B,没有任何反应,并且在最短时间内返回 1000 行。 但是当我们想要将此结果集插入另一个表(内存优化表或普通表或甚至临时表)时,插入 10 20 秒。< / p>

有什么想法吗?

更新:添加了正常方案和内存优化表的执行计划 With Memory Optimized Table With Normal Table

1 个答案:

答案 0 :(得分:1)

当DML语句以Memory-Optimized表为目标时,查询无法并行运行,服务器将使用序列化计划。因此,您的第一个语句以单核模式运行。

在第二个实例中,DML语句利用了&#34; SELECT INTO / FROM&#34;是可并行化的。在SQL Server 2014中添加了此行为。因此,您将获得一个并行计划。以下是有关此内容的一些信息:

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

我使用内存优化目标无数次遇到此问题。我发现一个解决方案,如果检索的I / O要求很高,就是将SELECT语句的结果分段到临时表或其他中间位置,然后从那里插入到Memory-Optimized表中。

第三个问题是,默认情况下,只读取内存优化表的语句,即使该表不是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

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