【发布时间】:2011-03-31 13:27:05
【问题描述】:
表变量是在内存中还是在 tempdb 中创建的?相同的 短临时表?
【问题讨论】:
标签: sql sql-server tsql table-variable
表变量是在内存中还是在 tempdb 中创建的?相同的 短临时表?
【问题讨论】:
标签: sql sql-server tsql table-variable
在 MS SQL 2014 中引入了特殊类型的表变量“内存优化表变量”。而且他们不使用 tempdb。
【讨论】:
将在 tempdb 中创建一个临时表,您可以通过查询 tempdb 中的 sysobjects 表轻松检查它
例子
create table #test (Item char(1), TimeSold varchar(20))
select * from tempdb.sys.sysobjects
where name like '#test%'
您应该会看到名称类似于 #test_______000000000905 的内容,但随后会出现更多下划线
如果您需要检查临时表是否存在,请参阅How Do You Check If A Temporary Table Exists In SQL Server
表变量的结构也在 tempdb 中创建 要查看表变量,您可以这样做,但不能保证在创建他/她的表变量时没有人在您之前潜入。表变量名称类似于#7BB1235D
declare @v table(id int)
select top 1 * from tempdb.sys.sysobjects
where name like '#%'
and name not like '%[_]%'
order by crdate desc
select * from @v
【讨论】:
据我了解,表变量的结构至少总是在 TempDB 中创建。然后,作为pointed out by SQLMenace,数据可能会溢出,也可能不会溢出。
每this Microsoft Knowledge Base Article:
表变量不是仅用于内存的 结构体。因为一个表变量 可能容纳的数据多于无法容纳的数据 内存,它必须在磁盘上有一个位置 来存储数据。表变量是 在 tempdb 数据库中创建类似 到临时表。如果记忆是 可用,表变量和 创建临时表并 在内存中处理(数据 缓存)。
【讨论】:
tempdb 的数据页上。这些可能会或可能不会写入磁盘,如果写入磁盘,页面可能会或可能不会仍在缓冲池中。 Some relevant demonstrations at the very end of my answer here