使用内存中的 OLTP 表而不是临时表
Using In-Memory OLTP Tables instead of temporary tables
SQL Server 2014
介绍了一个看起来很棒的功能:In-Memory OLTP (In-Memory Optimization). It reminds me of MySQL's
MEMORY Storage Engine,我几年前尝试过并获得了更好的性能。
我知道有人already问过这个问题,但我对更有针对性的场景感兴趣:
几个 SSRS
报告使用大型存储过程,出于性能原因(对于具有大量连接、分组等的查询,执行计划非常丑陋和缓慢),使用临时 tables 保存部分结果。
由于临时table写入磁盘,我预计在处理大量数据(数万甚至数十万行)时会对性能产生影响。
在这种情况下使用 In-Memory OLTP tables
有意义吗?我正在考虑以下利弊。
优点:
- 应该明显更快,因为所有数据都存储在内存中
缺点:
- 需要明确的会话分离(table 应该包括某种会话标识符,以免混合来自不同
SPID
的数据)
- 需要显式数据清理以避免内存不足(与退出声明范围后自动删除临时 table 相对)
- 需要注意存储在table中的数据量
你没看错。
请注意,与其他 table 一样,temp tables 是惰性写入的(甚至比正常情况下更惰性)。写入磁盘通常不在关键路径上,因为它是异步发生的。除了非常大的临时 table 耗尽 SQL 服务器在内存中保留脏缓冲区的能力。
此外,如果临时 table 被快速释放,则根本不会有任何页面写入。
所以你在那里列出的 "pro" 通常不会(完全)生效。
也就是说,即使在互操作模式下,内存中的 table 也倾向于使用较少的 CPU。所以 "pro" 总是至少有一点点正确。
您可以考虑使用仅模式的 Hekaton tables。这肯定不会导致任何数据写入。
SQL Server 2014
介绍了一个看起来很棒的功能:In-Memory OLTP (In-Memory Optimization). It reminds me of MySQL's
MEMORY Storage Engine,我几年前尝试过并获得了更好的性能。
我知道有人already问过这个问题,但我对更有针对性的场景感兴趣:
几个 SSRS
报告使用大型存储过程,出于性能原因(对于具有大量连接、分组等的查询,执行计划非常丑陋和缓慢),使用临时 tables 保存部分结果。
由于临时table写入磁盘,我预计在处理大量数据(数万甚至数十万行)时会对性能产生影响。
在这种情况下使用 In-Memory OLTP tables
有意义吗?我正在考虑以下利弊。
优点:
- 应该明显更快,因为所有数据都存储在内存中
缺点:
- 需要明确的会话分离(table 应该包括某种会话标识符,以免混合来自不同
SPID
的数据) - 需要显式数据清理以避免内存不足(与退出声明范围后自动删除临时 table 相对)
- 需要注意存储在table中的数据量
你没看错。
请注意,与其他 table 一样,temp tables 是惰性写入的(甚至比正常情况下更惰性)。写入磁盘通常不在关键路径上,因为它是异步发生的。除了非常大的临时 table 耗尽 SQL 服务器在内存中保留脏缓冲区的能力。
此外,如果临时 table 被快速释放,则根本不会有任何页面写入。
所以你在那里列出的 "pro" 通常不会(完全)生效。
也就是说,即使在互操作模式下,内存中的 table 也倾向于使用较少的 CPU。所以 "pro" 总是至少有一点点正确。
您可以考虑使用仅模式的 Hekaton tables。这肯定不会导致任何数据写入。