Buforowanie planu zapytania (Entity SQL)

Za każdym razem, gdy zostanie podjęta próba wykonania zapytania, potok zapytania wyszukuje pamięć podręczną planu zapytania, aby sprawdzić, czy dokładne zapytanie jest już skompilowane i dostępne. Jeśli tak, używa ponownie buforowanego planu, a nie kompilowania nowego. Jeśli dopasowanie nie zostanie znalezione w pamięci podręcznej planu zapytania, zapytanie jest kompilowane i buforowane. Zapytanie jest identyfikowane przez kolekcję tekstu i parametrów Entity SQL (nazwy i typy). W przypadku wszystkich porównań tekstowych uwzględniana jest wielkość liter.

Konfigurowanie

Buforowanie planu zapytania można skonfigurować za pomocą programu EntityCommand.

Aby włączyć lub wyłączyć buforowanie planu zapytania za pomocą metody EntityCommand.EnablePlanCaching, ustaw tę właściwość na true wartość lub false. Wyłączenie buforowania planu dla poszczególnych zapytań dynamicznych, które prawdopodobnie nie będą używane więcej, a następnie po poprawie wydajności.

Buforowanie planu zapytań można włączyć za pomocą .EnablePlanCaching

Należy unikać zapytań dynamicznych, ogólnie rzecz biorąc. Poniższy przykład zapytania dynamicznego jest podatny na ataki polegający na wstrzyknięciu kodu SQL, ponieważ dane wejściowe użytkownika są przekazywane bezpośrednio bez żadnej weryfikacji.

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

Jeśli używasz zapytań generowanych dynamicznie, rozważ wyłączenie buforowania planu zapytań, aby uniknąć niepotrzebnego użycia pamięci dla wpisów pamięci podręcznej, które prawdopodobnie nie zostaną użyte ponownie.

Buforowanie planu zapytań na zapytaniach statycznych i zapytaniach sparametryzowanych może zapewnić korzyści z wydajności. Poniżej przedstawiono przykład zapytania statycznego:

var query = "SELECT sp.SalesYTD FROM AdventureWorksEntities.SalesPerson as sp";

Aby zapytania były prawidłowo dopasowywane przez pamięć podręczną planu zapytań, powinny być zgodne z następującymi wymaganiami:

  • Tekst zapytania powinien być stałym wzorcem, najlepiej ciągiem stałym lub zasobem.

  • EntityParameter lub ObjectParameter należy użyć wszędzie tam, gdzie musi zostać przekazana wartość podana przez użytkownika.

Należy unikać następujących wzorców zapytań, które niepotrzebnie używają miejsc w pamięci podręcznej planu zapytania:

  • Zmienia wielkość liter w tekście.

  • Zmiany w białych odstępach.

  • Zmiany w wartościach literałów.

  • Zmiany w tekście wewnątrz komentarzy.

Zobacz też