今天我想進一步談下SQL Server里的計劃緩存和它的副作用。我們都知道,每個提交到SQL Server的邏輯查詢,會編譯為物理執(zhí)行計劃。這個執(zhí)行計劃然后會緩存為所謂的計劃緩存,用于后期重用?,F(xiàn)在我們首先來談下即席SQL語句和它的負作用,還有它們帶來的性能問題。
即席SQL語句(Adhoc SQL Statements)
每次當你提交一個即席SQL語句到SQL Server,對于每個特定查詢,都會生成一個執(zhí)行計劃?!疤囟ú樵儭笔鞘裁匆馑??答案很簡單:SQL Server對每個完整的SQL語句(包括你的參數(shù)值)生成一個哈希值,并使用這個哈希值作為計劃緩存的查找值。如果使用這個哈希值找到一個執(zhí)行計劃,計劃就會重用,否則在計劃緩存里會編譯一個新的執(zhí)行計劃。假設(shè)你提交下列3個查詢到SQL Server:
SELECT * FROM Sales.SalesOrderHeaderWHERE CustomerID = 11000GOSELECT * FROM Sales.SalesOrderHeaderWHERE CustomerID = 30052GOSELECT * FROM Sales.SalesOrderHeaderWHERE CustomerID = 11223GO