使用内存中的OLTP表而不是临时表

时间:2016-03-16 14:19:36

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

SQL Server 2014介绍了它看起来很棒的功能:In-Memory OLTP (In-Memory Optimization)。这让我想起MySQL's MEMORY Storage Engine,这是我几年前尝试过的,并且获得了更好的表现。

我知道已经问过already,但我对更具针对性的情况感兴趣:

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

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

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

优点:

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

缺点:

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

1 个答案:

答案 0 :(得分:2)

你做对了。

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

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

所以你在那里列出的“亲”通常不会产生(完全)效果。

即使在互操作模式下,内存表往往使用更少的CPU。所以“亲”总是至少有点真实。

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