【问题标题】:Insert from memory optimized table to physical table从内存优化表插入到物理表
【发布时间】:2017-07-11 05:33:15
【问题描述】:

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

  • A 是内存优化表
  • B是一张普通的桌子

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

有什么想法吗?

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

【问题讨论】:

  • 显示执行计划
  • 依赖于插入表中创建的索引,因为DML操作会很慢...请分享执行计划
  • 可能您的网络太慢了,需要 40 秒才能将 1000 行传输到客户端。也许您在进行初始选择后运行插入,因此记录被缓存。
  • 上传执行计划

标签: sql-server memory-optimized-tables


【解决方案1】:

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

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

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

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

第三个问题是,默认情况下,仅从内存优化表读取的语句,即使该表不是 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 都将在单核上运行。这是设计使然。如果您需要利用并行性,如果内存优化表是语句的目标,您就无法做到这一点。您需要对不同的方法进行基准测试,以找到最适合您的场景的方法。

【讨论】:

    猜你喜欢
    • 2018-07-14
    • 1970-01-01
    • 2012-12-12
    • 1970-01-01
    • 2018-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多