2016-02-08 156 views
1

前幾天我被問到這個問題(tel intvw),我被畫成空白。我說執行計劃存儲在服務器中,所以它被稱爲STORED Procedure。但我不確定我是否正確。爲什麼sql存儲過程被稱爲存儲過程

我以後的研究表明,有多數民衆贊成專用於存儲執行計劃的SQL Server內部計劃高速緩存或過程高速緩存。在that article中還有對所謂的編譯計劃存根的引用。所以看起來,編譯計劃存根(Compiled Plan Stub)首先被創建,然後執行計劃被創建。

所以,我想知道是短暫

  1. 是什麼,當我創建一個存儲過程中發生的步驟是什麼?

  2. 爲什麼存儲過程稱爲存儲過程(如果問題有意義)?

如果你可以引用我現有的SO問題或其他文章,也應該沒問題。

+2

只是一個猜測,但是:它被稱爲過程,因爲...呃...它是一個過程,它被稱爲存儲過程,因爲它存儲在數據庫中(與內置過程相反,或者到專門的T-SQL代碼)。 – Heinzi

+0

:),多數民衆贊成我的想法當我被問到。但需要更多信息。 – VivekDev

+0

當他們在數據庫中甚至需要這個特性是否需要爭鬥時,我本來會喜歡他們。我很高興「親」存儲過程的人贏得了這場鬥爭。 –

回答

1

爲什麼調用的存儲過程

一個存儲過程因爲它是一個過程存儲在數據庫中。

在其他語言/環境中,可以執行的過程通常不是存儲。它們以字節碼或彙編器編譯。即該程序不再以其原始文本格式存在。原始程序不能像它在這些環境中創建時那樣被檢索(儘管逆向工程可以檢索該程序的本質)。

當您在SQL Server中的存儲過程,它完全存放在原全文形式,相同的壓痕,相同的外殼中,相同的路線,包括註釋和所有。您可以檢索完整創建存儲過程的文本。

關於執行存儲過程

當SQL Server要執行存儲過程簡單的解釋,它會首先檢查緩存,看它是否已經被編譯。如果它在緩存中找到條目(以執行計劃的形式),它將使用該條目執行。如果它沒有找到條目,它會將該過程編譯爲執行計劃,將其存儲在高速緩存中供以後使用,然後使用執行計劃執行它。

有些情況下強制存儲過程被重新編譯,例如,當清除執行計劃緩存時(模式更改,統計信息更新...)或向編譯器提供強制重新編譯命令時(存儲過程WITH RECOMPILE,查詢選項OPTION(RECOMPILE),...)。

2

我說的執行計劃存儲在服務器,以便其調用的存儲過程。

錯誤。執行計劃也存儲在服務器上用於動態SQL。我不知道爲什麼它被稱爲存儲過程,但整個過程存儲在服務器上(代碼等)。我可以認爲這是原因 - 但執行計劃(緩存)在這裏並不重要,因爲所有的執行計劃都可能存儲在那裏。

對於1:你在乎什麼?顯然一個SQL語句被執行。有一些解析,以確保它是有效的。其餘部分是實現細節 - 甚至可能在版本之間有所不同。我會假設一個SP存儲在字節碼的某個級別 - 但是,誰又在乎呢?我做了25年的數據庫級開發,甚至從未考慮過我的考慮。

+0

好的,但你能回答我的第一個問題嗎?當我創建存儲過程時,會發生什麼步驟?是編譯計劃存根,然後創建執行計劃? – VivekDev

+1

哪一部分「不相關」你不明白?要完成所有步驟,您需要使用sql server源代碼。即使問這個也沒有意義。你命名2個結果 - 這不是步驟。 – TomTom