通过 callproc 调用存储过程会导致缓存膨胀吗?
Posted
技术标签:
【中文标题】通过 callproc 调用存储过程会导致缓存膨胀吗?【英文标题】:Will calling stored procedures via callproc cause cache bloat? 【发布时间】:2014-12-30 14:57:20 【问题描述】:我正在调用存储过程如下:
conn.autocommit(True)
with conn.cursor(as_dict=False) as cur:
cur.callproc(proc_name, query_params)
return list(cur)
Profiler 显示这些调用:
RPC:Completed exec dbo.SelectCustomer 'Jane', 'Doe'
(snip)
RPC:Completed exec dbo.SelectCustomer 'John', 'Doe'
这会导致服务器缓存膨胀吗?
【问题讨论】:
你知道sql server对存储过程重复使用缓存的执行计划。 【参考方案1】:不,不会的。只要查询计划保留在计划缓存中,它就会在调用该存储过程时被重用。您可以使用以下查询检查计划缓存中的查询计划:
SELECT *
FROM sys.dm_exec_cached_plans a
CROSS APPLY sys.dm_exec_sql_text(plan_handle) b
CROSS APPLY sys.dm_exec_query_plan(plan_handle) c
WHERE text LIKE '%SprocName%'
AND b.dbid = DB_ID('DatabaseName')
ORDER BY a.size_in_bytes desc
有几个原因可以从计划缓存中清除查询计划:
-
内存压力 - 当新计划需要内存时,旧的、未使用的计划将被清除。
对数据库的更改,包括在 SP 中使用的表、对 SP 的更改、对 SP 使用的索引所做的更改、对统计信息的更改等等。
微软详细阐述了这个话题here。
【讨论】:
我运行了几次查询,发现使用计数在增加。谢谢!不幸的是,名为 text 的列以 CREATE PROCEDURE 开头,这让我困惑了一会儿:我不是在创建过程,只是在执行它。以上是关于通过 callproc 调用存储过程会导致缓存膨胀吗?的主要内容,如果未能解决你的问题,请参考以下文章
使用 callproc 从 django 调用 PL/SQL 过程