Share via


查詢計畫快取 (Entity SQL)

每當嘗試執行查詢時,查詢管線就會查閱它的查詢快取計畫,以查看精確的查詢是否已編譯且可用。如果確實如此,它會重複使用快取的計畫,而不是建立新的計畫。如果查詢計畫快取中找不到相符項目,就會編譯及快取此查詢。查詢是由它的 Entity SQL 文字和參數集合 (名稱和型別) 所識別。所有的文字比較都會區分大小寫。

組態

查詢計畫快取可透過 EntityCommand 來設定。

若要透過 System.Data.EntityClient.EntityCommand.EnablePlanCaching 來啟用或停用查詢計畫快取,請將此屬性設定為 truefalse。針對不太可能使用一次以上的個別動態查詢停用計畫快取時,將會提升效能。

如果您使用物件服務,可以透過 EnablePlanCaching 啟用查詢計畫快取。

建議的作法

一般來說,應該避免動態查詢。下列動態查詢範例容易受到 SQL 插入式攻擊的侵害,因為它會在沒有任何驗證的情況下直接接受使用者輸入。

"SELECT sp.SalesYTD FROM AdventureWorksEntities.SalesPerson as sp WHERE sp.EmployeeID = " + employeeTextBox.Text;

如果您使用動態產生的查詢,請考慮停用查詢計畫快取,避免針對不太可能重複使用的快取項目產生不必要的記憶體耗用量。

靜態查詢和參數化查詢上的查詢計畫快取可提供效能方面的優點。下列是靜態查詢的範例:

"SELECT sp.SalesYTD FROM AdventureWorksEntities.SalesPerson as sp";

如果是查詢計畫快取所要適當比對的查詢,這些查詢應該要符合以下規定:

  • 查詢文字應該是固定模式,最好是某個固定字串或資源。

  • 每當必須傳遞使用者提供的值時,就應該使用 EntityParameterObjectParameter

您應該避免下列查詢模式,這樣會耗用查詢計畫快取中的位置,而這是不必要的:

  • 變更為文字中的字母大小寫。

  • 變更為泛空白字元。

  • 變更為常值。

  • 變更為註解內的文字。

另請參閱

概念

Entity SQL 概觀