sp_prepexec(sp_execute)与sp_executeSQL


8

问题的实质:实际的存储过程是实现临时表缓存的唯一机制,还是sp_executeSQL/ 等系统存储过程sp_execute也利用了它们?

我不是DBA,所以请少说话。我们的应用程序发送了准备好的语句,这些语句从探查器中运行,我看到它运行所有SQL,sp_prepexec这是同时运行sp_prepare和的系统过程sp_execute。我要尝试做的是弄清楚我是否从临时表缓存中受益。

我一直在使用带有object_id()的本指南来检查行为

https://sqlkiwi.blogspot.com/2012/08/temporary-tables-in-stored-procedures.html

然后,此博客文章上的第3点表明EXEC无法使用临时表缓存,但忽略了sp_executeSQL是否可以:http : //blogs.msdn.com/b/turgays/archive/2013/09/18/exec-vs- sp-executesql.aspx

在通过客户端发送的查询中,我创建了一个简单的临时表。

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已更改。这使我相信只有“真正的”用户创建的存储过程才能利用临时表缓存。

Answers:


9

实际的存储过程是实现临时表缓存的唯一机制,还是系统存储过程(例如sp_executeSQL/)sp_execute还利用了它们?

您需要一个真正的存储过程(CREATE PROCEDURE)来受益于临时表缓存。这包括临时存储过程(#procname)。

这篇博客文章的第3点指出,EXEC无法使用临时表缓存,但是没有使用sp_executeSQL。

注意EXECUTE用于运行sp_executesql

测试:有很多方法可以检查是否正在缓存。问题中引用的我的原始文章中列出了其中的一些内容,我的后续文章Temporary Table Caching Explained中显示了更多方法,例如:

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也会被缓存,从SQL Server 2012开始,当与一起使用时也可以被缓存sp_executesql。有关详细信息,请参见链接的CSS博客文章。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.