Microsoft® SQL Server™ 2000 有用于存儲執(zhí)行計劃和數(shù)據(jù)緩沖區(qū)的內(nèi)存池。池內(nèi)分配給執(zhí)行計劃或數(shù)據(jù)緩沖區(qū)的百分比隨系統(tǒng)狀態(tài)動態(tài)波動。內(nèi)存池中用于存儲執(zhí)行計劃的部分稱為過程高速緩存。 SQL Server 2000 執(zhí)行計劃包含下面兩個主要組件: ◆查詢計劃 執(zhí)行計劃的主體是一個重入的只讀數(shù)據(jù)結構,可由任意數(shù)量的用戶使用。這稱為查詢計劃。查詢計劃中不存儲用戶環(huán)境。查詢計劃在內(nèi)存中永遠不會有一個或兩個以上的復本:一個復本用于所有串行執(zhí)行,一個復本用于所有并行執(zhí)行。并行復本覆蓋所有的并行執(zhí)行,與并行執(zhí)行的并行度無關。 ◆執(zhí)行環(huán)境 每個正在執(zhí)行查詢的用戶都有一個包含其執(zhí)行專用數(shù)據(jù)(如參數(shù)值)的數(shù)據(jù)結構。該數(shù)據(jù)結構稱為執(zhí)行環(huán)境。執(zhí)行環(huán)境數(shù)據(jù)結構可以重新使用。如果用戶執(zhí)行查詢而其中的一個結構未使用,將會用新用戶的環(huán)境重新初始化該結構。 在 SQL Server 2000 中執(zhí)行任何 SQL 語句時,關系引擎將首先查看過程高速緩存中是否有用于同一 SQL 語句的現(xiàn)有執(zhí)行計劃。SQL Server 2000 重新使用所找到的任何現(xiàn)有計劃以節(jié)省重新編譯 SQL 語句的開銷。如果沒有現(xiàn)有執(zhí)行計劃,則 SQL Server 2000 將為查詢生成新的執(zhí)行計劃。 SQL Server 2000 有一個高效的算法,可查找用于任何特定 SQL 語句的現(xiàn)有執(zhí)行計劃。在大多數(shù)系統(tǒng)中,這種掃描所使用的最小資源比通過重新使用現(xiàn)有計劃而不是編譯每個 SQL 語句所節(jié)省的資源要少。 該算法將新的 SQL 語句與高速緩存內(nèi)現(xiàn)有的未用執(zhí)行計劃相匹配,并要求所有的對象引用完全合法。例如,這兩個 SELECT 語句中的第一個語句與現(xiàn)有計劃不匹配,而第二個語句則匹配: | SELECT * FROM EmployeesSELECT * FROM Northwind.dbo.Employees | 在 SQL Server 2000 實例中,個別執(zhí)行計劃重新使用的概率比在 SQL Server 6.5 或更早版本中高。 執(zhí)行計劃的老化 執(zhí)行計劃生成后便駐留在過程高速緩存中。只有當需要空間時,SQL Server 2000 才使舊的未用計劃從高速緩存老化掉。每個查詢計劃和執(zhí)行環(huán)境都有相關的成本因子,可表明編譯結構所需的費用。這些數(shù)據(jù)結構還有一個年齡字段。對象每由連接引用一次,其年齡字段便按編譯成本因子遞增。例如,如果一個查詢計劃的成本因子是 8 且被引用了兩次,它的年齡將變?yōu)?16。惰性寫入器進程定期掃描過程高速緩存內(nèi)的對象列表。惰性寫入器減少每個對象的年齡字段,每掃描一次減少 1。在本例中,查詢計劃的年齡經(jīng)過 16 次過程高速緩存掃描后減為 0,除非其他用戶引用了該計劃。如果滿足下面三個條件,惰性寫入器進程將釋放對象: 內(nèi)存管理器需要內(nèi)存且所有可用內(nèi)存都正在使用。 對象的年齡字段是 0。 對象在當前沒有被連接引用。 因為每次引用對象時其年齡字段都會增加,所以經(jīng)常被引用的對象的年齡字段不會減為 0,也不會從高速緩存老化掉。不經(jīng)常被引用的對象將很快滿足釋放條件,但是不會真被釋放,除非其它對象有內(nèi)存需求。
|