SQL Server LOB 变量和内存使用情况

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)

限制以字节为单位,因此存储的字符数取决于编码。