同会话子存储过程中内存优化表替代临时表的可行性咨询
好问题!在SQL Server里,内存优化表确实有对应会话级共享的方案,不过和传统临时表的实现逻辑略有不同,我给你讲明白:
内存优化临时表:会话内共享的核心选择
- 首先,内存优化临时表就是专门为会话内共享设计的——它和传统临时表一样,只在创建它的会话中可见,同一个会话里的所有存储过程(包括嵌套的子存储过程)都能访问它,完全匹配你的需求场景。
- 和传统临时表相比,它全程在内存中运行,没有磁盘IO开销,性能提升明显;而且它的元数据也存在内存里,不依赖tempdb,能避免很多tempdb相关的性能瓶颈。
关键使用要点
- 创建语法:需要在
CREATE TABLE里加上WITH (MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_ONLY)参数。举个例子:
这里CREATE TABLE #MemOptTempTable ( ID INT PRIMARY KEY NONCLUSTERED HASH WITH (BUCKET_COUNT = 10000) , Data VARCHAR(100) ) WITH (MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_ONLY);DURABILITY = SCHEMA_ONLY表示只保留表结构,数据会在会话结束后自动清除,和传统临时表的生命周期完全一致。 - 访问规则:同一个会话内的任何存储过程,不管是主存储还是嵌套调用的子存储,只要是在这个会话里创建的内存优化临时表,都能直接读写,不需要额外配置权限。
要注意的细节
- 哈希索引的桶数:创建内存优化临时表时,哈希索引的
BUCKET_COUNT要根据预期的数据量合理设置,一般建议设为预期行数的1-2倍,不然会影响查询性能。 - 别用持久化内存优化表:如果设置
DURABILITY = SCHEMA_AND_DATA,那这个表是全局可见的持久化表,不是会话级的,完全不适合你的场景,一定要用SCHEMA_ONLY。 - 自动清理:内存优化临时表会在会话结束后自动被清理,不需要手动
DROP TABLE,当然你也可以在会话中手动删除它。
内容的提问来源于stack exchange,提问作者Christian Gräfe
相关产品推荐
相关产品推荐

