想象一下SQL Server 2016中的这种情况:我们必须使用表A和B
我们加入A和B,没有任何反应,并且在最短时间内返回 1000 行。 但是当我们想要将此结果集插入另一个表(内存优化表或普通表或甚至临时表)时,插入 10 到 20 秒。< / p>
有什么想法吗?
答案 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表是语句的目标,则无法执行此操作。您需要对不同的方法进行基准测试,以找到最适合您的方案的方法。