通过callproc调用存储过程会导致缓存膨胀吗?

时间:2014-12-30 14:57:20

标签: python sql-server python-2.7 sql-server-2012 pymssql

我按如下方式调用存储过程:

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'

这会导致服务器上的缓存膨胀吗?

1 个答案:

答案 0 :(得分:2)

不,不会。只要查询计划保留在计划缓存中,就会在调用该存储过程时重用它。您可以使用以下查询检查计划缓存中的查询计划:

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

可以从计划缓存中清除查询计划有几个原因:

  1. 内存压力 - 当新计划需要内存时,旧的未使用的内存将被清除。
  2. 对数据库的更改,包括SP中使用的表,SP的更改,SP使用的索引所做的更改,统计信息的更改等。
  3. Microsoft详细阐述了此主题here