Pau*_*ite 9 sql-server memory database-internals blob
当我在 SQL Server 中使用大对象 (LOB) 数据类型的变量时,整个变量是否始终保存在内存中?即使是2GB大小?
Pau*_*ite 17
2GB LOB 限制仅适用于持久存储(除FILESTREAM
);变量没有限制。
SQL Server从纯内存实现开始。
如果 LOB 数据的大小超过512KB(524,288 字节),它将更改为基于tempdb的备份方案。
备份方案将 LOB 数据存储在内部tempdb LOB 页树中。
这些tempdb页像往常一样缓存在缓冲池中,但可能会根据需要由惰性写入器刷新到磁盘。
即使所有页面都保留在内存中,使用tempdb支持的方案也会产生额外的开销。
当变量超出范围时,页面将同步释放。对于非常大的 LOB,这可能需要一些时间。
DECLARE
-- 512KB: In-memory
@V1 varchar(max) = REPLICATE(CONVERT(varchar(max), 'X'), 524288),
-- 512KB + 1: Buffered, tempdb-backed
@V2 varchar(max) = REPLICATE(CONVERT(varchar(max), 'X'), 524289);
Run Code Online (Sandbox Code Playgroud)
限制以字节为单位,因此存储的字符数取决于编码。