问题的核心是:实际存储过程是实现临时表缓存的唯一机制,还是像sp_executeSQL
/ sp_execute
这样的系统存储过程也利用了它们?
我不是DBA,所以请用一些小词。我们的应用程序发送预先准备好的语句,在分析器中,我看到通过sp_prepexec
运行所有的SQL,这是一个运行sp_prepare
和sp_execute
的系统过程。我想要做的是弄清楚我是否从临时表缓存中受益。
我在object_id()中使用了这个指南来检查行为
https://sqlkiwi.blogspot.com/2012/08/temporary-tables-in-stored-procedures.html
然后,博客文章中的第3点建议,EXEC不能使用临时表缓存,但忽略了sp_executeSQL是否可以:链接。
在通过客户端发送的查询中,我创建了一个简单的临时表。
DECLARE @foo int; -- set by JDBC, unused but required to force a prepared statement
SELECT 1 AS id
INTO #tmp
SELECT OBJECT_ID('tempdb..#tmp');
在分析器中,我可以看到:
declare @p1 int
set @p1=NULL
exec sp_prepexec @p1 output,N'@P1 int',N'declare @foo INT = @P1
SELECT 1 as id
into #tmp
select Object_id(''tempdb..#tmp'');
DROP TABLE #tmp;',1
select @p1
我也从这里得到了一个缓存。但是,临时表的object_id似乎在我身上发生了变化,如果这个临时表是在一个真正的存储过程中创建的,这不是我会看到的行为。但是,当我通过sp_executeSQL
运行相同的代码时,我也看到临时表的object_id已经发生了变化。这使我相信只有“真正的”用户创建的存储过程才能利用临时表缓存。
发布于 2014-12-11 19:08:42
实际的存储过程是实现临时表缓存的唯一机制,还是像
sp_executeSQL
/sp_execute
这样的系统存储过程也利用了它们?
您需要一个真正的存储过程(CREATE PROCEDURE
)才能从临时表缓存中获益。这包括临时存储过程(#procname
)。
博客文章中的第3点表明,EXEC不能使用临时表缓存,但忽略了sp_executeSQL是否可以使用。
注意,EXECUTE
用于运行sp_executesql
。
测试:有许多方法来检查缓存是否正在发生。在问题中引用的原始文章中列出了其中一些方法,在我的后续文章临时表缓存解释中显示了更多的方法,例如:
SELECT
DOMCC.name,
DOMCC.pages_kb,
DOMCC.pages_in_use_kb,
DOMCC.entries_count,
DOMCC.entries_in_use_count
FROM sys.dm_os_memory_cache_counters AS DOMCC
WHERE DOMCC.[type] = N'CACHESTORE_TEMPTABLES';
存储过程输入的TVP也被缓存,而从Server 2012开始,在与sp_executesql
一起使用时也可以缓存。有关详细信息,请参阅链接的CSS博客文章。
https://dba.stackexchange.com/questions/85949
复制相似问题