这似乎是一个有很多神话和相互冲突的领域。
那么SQL Server中的表变量和本地临时表有什么区别呢?
我正在查看此处的文章 Temporary Tables vs. Table Variables and their Effect on SQL Server Performance and on SQL Server 2008 能够重现与 2005 中显示的结果类似的结果。
当执行只有 10 行的存储过程(定义如下)时,表变量 version out 执行临时表 version 的两倍以上。
我清除了过程缓存并运行了两个存储过程 10,000 次,然后再重复该过程 4 次。结果如下(每批时间以毫秒为单位)
T2_Time V2_Time
----------- -----------
8578 2718
6641 2781
6469 2813
6766 2797
6156 2719
Run Code Online (Sandbox Code Playgroud)
我的问题是:表变量版本性能更好的原因是什么?
我做了一些调查。例如查看性能计数器
SELECT cntr_value
from sys.dm_os_performance_counters
where counter_name = 'Temp Tables Creation Rate';
Run Code Online (Sandbox Code Playgroud)
确认在这两种情况下,临时对象都按预期在第一次运行后被缓存,而不是每次调用都从头开始创建。
类似地跟踪Profiler 中的Auto Stats
, SP:Recompile
,SQL:StmtRecompile
事件(下面的屏幕截图)显示这些事件仅发生一次(在第一次调用#temp
表存储过程时),其他 9,999 次执行不会引发任何这些事件。(表变量版本没有得到任何这些事件) …
我们有一个 SQL Server 2005 数据库,临时数据库已满。通过进入 SQL Server Management Studio,我可以看到 tempdb 中的所有临时表。是否可以判断哪个会话持有哪个临时表?理想情况下,一个查询将列出每个会话使用的临时表。
谢谢,