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