2014-12-30 61 views
0

我調用存儲過程如下:通過callproc調用存儲過程會導致緩存膨脹?

conn.autocommit(True) 
with conn.cursor(as_dict=False) as cur: 
    cur.callproc(proc_name, query_params) 
    return list(cur) 

的探查顯示這些電話:

RPC:Completed exec dbo.SelectCustomer 'Jane', 'Doe' 
(snip) 
RPC:Completed exec dbo.SelectCustomer 'John', 'Doe' 

可以在服務器上這個事業緩存膨脹?

+0

你知道sql server重新使用存儲過程的緩存執行計劃。 –

回答

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使用的索引所做的更改,對統計信息的更改等。

微軟詳細闡述了這個主題here

+0

我跑了我的查詢幾次,看到usecounts增加。謝謝!不幸的是,名爲文本的列以CREATE PROCEDURE開頭,這使我困惑了一會兒:我沒有創建一個過程,只是執行它。 – AlexC