1

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

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

我们加入 A 和 B,什么都没有发生,并且在最短的时间内返回了1000行。但是当我们要将这个结果集插入另一个表(内存优化表或普通表甚至临时表)时,插入需要1020秒。

有任何想法吗?

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

4

1 回答 1

3

当 DML 语句以内存优化表为目标时,查询不能并行运行,服务器将采用序列化计划。因此,您的第一条语句以单核模式运行。

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

参考: 新增功能(数据库引擎)- SQL Server 2014

我在内存优化目标上遇到过无数次这个问题。我发现的一种解决方案是,如果检索时的 I/O 要求很高,则将 SELECT 语句的结果暂存到临时表或其他中间位置,然后从那里插入到内存优化表中。

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

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

参考: 更新使 DML 查询计划能够在 SQL Server 2016 中并行扫描查询内存优化表

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

于 2018-02-19T12:00:36.343 回答