您在問題中顯示的兩個陳述的唯一區別在於,您在一個陳述中使用了TWO PART NAME
,即[Schema].[Object]
,而在其他語句中,您只使用對象名稱來調用該過程。
這對存儲過程的執行計劃沒有任何影響,但它確實會影響sql server如何找到此存儲過程。
總是最好使用兩個部分名稱,因爲它消除了解析模式的需要,並且爲了執行此過程,sql服務器執行的工作量較少。
架構名稱
在另一方面,如果你不,當你調用它的SQL服務器要經過幾個步驟來查找存儲的過程,它是一個存儲過程使用兩個部分名稱如下。
- 它在當前數據庫的
sys
模式中查找該過程。
- 如果它不能在sys架構中找到它,而不是它在
Caller's Default Schema
中查找它。
- 如果它不在那裏,而是從外部調用過程的模式中看,如果從另一個過程中調用此過程。
- 如果找不到它,最終會尋找
dbo
模式中的過程。
正如您所看到的,在調用過程時只需添加模式名稱就可以爲sql server節省一些工作,因此在sql server中調用過程時最好使用模式名稱。
執行計劃
當我們在SQL Server中執行一個SQL查詢時,SQL Server,以便成功地執行查詢經過4個步驟。
- 解析語法。
- 轉換爲查詢樹。
- 創建一個執行計劃。
- 執行。
在存儲過程的情況下,只有在創建存儲過程時纔會執行前兩個步驟。
當存儲過程第一次執行時發生第三步。
並且最後第四步發生在每個後續執行中。
現在創建執行計劃可能會有多種原因。其中一些是
- 存儲過程尚未執行一段時間,並且緩存中的 計劃已從高速緩存存儲器中清除。
- 索引已被刪除或添加到基礎表。
- 統計數據已更新。
- 帶重新編譯選項的已執行存儲過程。
優秀的信息! –
You'er welcome :) –