首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >sp_prepexec (sp_execute)与sp_executeSQL

sp_prepexec (sp_execute)与sp_executeSQL
EN

Database Administration用户
提问于 2014-12-11 18:06:05
回答 1查看 6.3K关注 0票数 8

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

我不是DBA,所以请用一些小词。我们的应用程序发送预先准备好的语句,在分析器中,我看到通过sp_prepexec运行所有的SQL,这是一个运行sp_preparesp_execute的系统过程。我想要做的是弄清楚我是否从临时表缓存中受益。

我在object_id()中使用了这个指南来检查行为

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

然后,博客文章中的第3点建议,EXEC不能使用临时表缓存,但忽略了sp_executeSQL是否可以:链接

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

代码语言:javascript
运行
复制
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');

在分析器中,我可以看到:

代码语言:javascript
运行
复制
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已经发生了变化。这使我相信只有“真正的”用户创建的存储过程才能利用临时表缓存。

EN

回答 1

Database Administration用户

回答已采纳

发布于 2014-12-11 19:08:42

实际的存储过程是实现临时表缓存的唯一机制,还是像sp_executeSQL / sp_execute这样的系统存储过程也利用了它们?

您需要一个真正的存储过程(CREATE PROCEDURE)才能从临时表缓存中获益。这包括临时存储过程(#procname)。

博客文章中的第3点表明,EXEC不能使用临时表缓存,但忽略了sp_executeSQL是否可以使用。

注意,EXECUTE用于运行sp_executesql

测试:有许多方法来检查缓存是否正在发生。在问题中引用的原始文章中列出了其中一些方法,在我的后续文章临时表缓存解释中显示了更多的方法,例如:

代码语言:javascript
运行
复制
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博客文章。

票数 9
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/85949

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档