2014-04-23 85 views
1

想象一下,一個名爲dbo.TheBestCodedProcedure程序,如果是通過以下方式執行:何時創建多個執行計劃?

EXEC dbo.TheBestCodedProcedure 

而且

EXEC TheBestCodedProcedure 

雙方將成功執行,但有多少執行的創建計劃?我的理解是,執行計劃基於被調用的對象的名稱和提供的參數。即使提供了相同的參數,我也看到了多個執行計劃的例子,唯一的區別是dbo.前綴,這是真的還是不是?什麼是什麼時候什麼規則創建一個額外的執行計劃?

回答

2

您在問題中顯示的兩個陳述的唯一區別在於,您在一個陳述中使用了TWO PART NAME,即[Schema].[Object],而在其他語句中,您只使用對象名稱來調用該過程。

這對存儲過程的執行計劃沒有任何影響,但它確實會影響sql server如何找到此存儲過程。

總是最好使用兩個部分名稱,因爲它消除了解析模式的需要,並且爲了執行此過程,sql服務器執行的工作量較少。

架構名稱

在另一方面,如果你不,當你調用它的SQL服務器要經過幾個步驟來查找存儲的過程,它是一個存儲過程使用兩個部分名稱如下。

  1. 它在當前數據庫的sys模式中查找該過程。
  2. 如果它不能在sys架構中找到它,而不是它在Caller's Default Schema中查找它。
  3. 如果它不在那裏,而是從外部調用過程的模式中看,如果從另一個過程中調用此過程。
  4. 如果找不到它,最終會尋找dbo模式中的過程。

正如您所看到的,在調用過程時只需添加模式名稱就可以爲sql server節省一些工作,因此在sql server中調用過程時最好使用模式名稱。

執行計劃

當我們在SQL Server中執行一個SQL查詢時,SQL Server,以便成功地執行查詢經過4個步驟。

  1. 解析語法。
  2. 轉換爲查詢樹。
  3. 創建一個執行計劃。
  4. 執行。

在存儲過程的情況下,只有在創建存儲過程時纔會執行前兩個步驟。
當存儲過程第一次執行時發生第三步。
並且最後第四步發生在每個後續執行中。

現在創建執行計劃可能會有多種原因。其中一些是

  • 存儲過程尚未執行一段時間,並且緩存中的 計劃已從高速緩存存儲器中清除。
  • 索引已被刪除或添加到基礎表。
  • 統計數據已更新。
  • 帶重新編譯選項的已執行存儲過程。
+0

優秀的信息! –

+0

You'er welcome :) –

3

要回答你原來的問題,試試這個:

create procedure dbo.proc_test 
@i int 
as 
select @i 
go 

exec proc_test 1 
exec dbo.proc_test 2 
go 

select usecounts, text 
from sys.dm_exec_cached_plans 
cross apply sys.dm_exec_sql_text(plan_handle) 
where text like '%proc_test%' 
and text not like '%dm_exec_cached_plans%' 

只有一個緩存中的計劃,你可以看到。

對於計劃緩衝能力和可重用性的完整討論,請在這裏看到:

http://technet.microsoft.com/en-us/library/ee343986%28v=sql.100%29.aspx

IMO它太寬泛的主題在此處詳細討論。

+0

你的例子給出了一個緩存計劃 –

+0

是的,它是我的觀點。 – dean

+0

對不起,我沒有注意到這個文字 –