每當嘗試執行查詢時,查詢管線就會查詢其查詢計劃快取,以查看確切的查詢是否已編譯且可供使用。 如果是,它會重複使用快取的計劃,而不是建置新的計劃。 如果在查詢計劃快取中找不到相符專案,則會編譯並快取查詢。 查詢是由其 Entity SQL 文字和參數集合所識別(名稱和類型)。 所有文字比較都會區分大小寫。
設定
查詢計劃快取可透過 來設定 EntityCommand。
若要透過 EntityCommand.EnablePlanCaching啟用或停用查詢計畫快取,請將此屬性設定為 true 或 false。 停用個別動態查詢的計劃快取,這些查詢不太可能再使用一次,一旦改善效能。
您可以透過 EnablePlanCaching啟用查詢計劃快取。
建議的做法
一般而言,應該避免動態查詢。 下列動態查詢範例很容易遭受 SQL 插入式攻擊,因為不需要任何驗證就直接接受用戶輸入。
var query = "SELECT sp.SalesYTD FROM AdventureWorksEntities.SalesPerson as sp WHERE sp.EmployeeID = " + employeeTextBox.Text;
如果您確實使用動態產生的查詢,請考慮停用查詢計劃快取,以避免不太可能重複使用之快取專案的不必要的記憶體耗用量。
靜態查詢和參數化查詢的查詢計劃快取可提供效能優勢。 以下是靜態查詢的範例:
var query = "SELECT sp.SalesYTD FROM AdventureWorksEntities.SalesPerson as sp";
若要讓查詢與查詢計劃快取正確比對,其應符合下列需求:
查詢文字應該是常數模式,最好是常數位符串或資源。
EntityParameter 或 ObjectParameter 應該在傳遞使用者提供的值時使用 。
您應該避免下列查詢模式,這在查詢計劃快取中不必要地取用位置:
文字中的字母大小寫變更。
空格符的變更。
常值變更。
批註內文字的變更。