通过 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 调用存储过程会导致缓存膨胀吗?的主要内容,如果未能解决你的问题,请参考以下文章

pymysql callproc() 似乎会影响后续选择

使用 callproc 从 django 调用 PL/SQL 过程

jfinal调用oracle存储过程

存储过程

pymssql调用sqlserver存储过程带output 参数

存储过程