【问题标题】:Using In-Memory OLTP Tables instead of temporary tables使用内存中 OLTP 表而不是临时表
【发布时间】:2016-03-16 14:19:35
【问题描述】:

SQL Server 2014 介绍了一个看起来很棒的功能:In-Memory OLTP (In-Memory Optimization)。让我想起了MySQL'sMEMORY Storage Engine,几年前我尝试过,获得了更好的性能。

我知道有人问过already,但我对更有针对性的场景感兴趣:

一些SSRS 报告使用大型存储过程,出于性能原因(对于具有大量连接、分组等的查询来说,执行计划非常丑陋和缓慢),通过使用临时表来拆分逻辑来保存部分结果。

由于临时表被写入磁盘,我预计在处理大量数据(数万甚至数十万行)时会对性能产生影响。

在这种情况下使用In-Memory OLTP tables 有意义吗?我正在考虑以下优点和缺点。

优点:

  • 应该明显更快,因为所有数据都存储在内存中

缺点:

  • 需要明确的会话分离(表应包含某种会话标识符,以免混合来自各种SPIDs 的数据)
  • 需要明确的数据清理以避免内存不足(与退出声明范围后自动删除的临时表相反)
  • 需要注意表中存储的数据量

【问题讨论】:

    标签: sql-server-2014 temp-tables in-memory in-memory-oltp


    【解决方案1】:

    你没看错。

    不过,请注意,临时表与其他任何表一样是懒惰编写的(甚至比正常情况下更懒惰)。写入磁盘通常不在关键路径上,因为它是异步发生的。除了非常大的临时表会耗尽 SQL Server 将脏缓冲区保留在内存中的能力。

    此外,如果临时表被快速释放,则根本不会有任何页面写入。

    因此,您在此处列出的“专业”通常不会(完全)生效。

    也就是说,即使在互操作模式下,内存表也倾向于使用更少的 CPU。所以“专业”总是至少有点真实。

    您可以考虑使用仅模式的 Hekaton 表。这肯定不会导致任何数据写入。

    【讨论】:

    • 感谢您的解释。在我看到的情况下,临时表可以达到 100K 大记录(20-30 列),并且该过程可能运行长达 10 分钟。一旦我有空闲时间,我将尝试使用 SQL Server 2014 实例(当前应用程序在 SQL Server 2012 上运行)。
    • 如果该过程在那个时间运行,那肯定不是因为那个临时表。听起来像10MB左右。应填充包括。 IO 在 1 秒左右。
    猜你喜欢
    • 1970-01-01
    • 2011-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-09
    • 1970-01-01
    相关资源
    最近更新 更多