Czytałem wspaniałe artykuły dotyczące buforowania planu SQL Server przez Kimberly Tripp, takie jak ten: http://www.sqlskills.com/blogs/kimberly/plan-cache-and-optimizing-for-adhoc-workloads/
Dlaczego istnieje nawet opcja „optymalizacji pod kątem obciążeń ad hoc”? Czy nie powinno to zawsze być włączone? Niezależnie od tego, czy programiści używają ad-hoc SQL, czy nie, dlaczego nie włączono by tej opcji w każdej instancji, która ją obsługuje (SQL 2008+), zmniejszając w ten sposób wzdęcie pamięci podręcznej?
źródło
Poniżej znajduje się mały kod, który pomoże ci zdecydować, czy „ optymalizacja przełączania dla obciążeń ad hoc ON / OFF” będzie korzystna czy nie. Zwykle sprawdzamy to w ramach naszej kontroli kondycji serwerów wewnętrznych i klientów.
Jest to najbezpieczniejsza opcja, aby włączyć i jest opisany dobrze Brad tutaj i Glenn Berry tutaj .
źródło
Pomyśl o serwerze produkcyjnym, który obsługuje tylko 5 różnych zapytań, ale kilka tysięcy z nich na sekundę. Jesteś zespołem programistów Microsoft SQL Server. Będziesz majstrować przy buforowaniu planu. Czy domyślnie włączasz to zachowanie, gdy wiesz, że niektórzy z twoich największych i najbardziej krytycznych klientów (np. Wewnętrzna implementacja SAP Microsoftu) pracują na tym samym kampusie i korzystają z tej samej kafeterii?
źródło
Włączenie opcji „ Optymalizuj pod kątem obciążeń ad hoc ” spowoduje, że zapytania ad-hoc uruchamiane 2. raz będą tak samo wolne jak 1., ponieważ będziesz kompilował plan wykonania i pobierał te same dane ( bez buforowania) te pierwsze 2 razy.
To może nie być wielka sprawa, ale zauważysz to podczas testowania zapytań.
Co się teraz stanie, jeśli ta opcja nie będzie włączona, a pamięć podręczna pełna zapytań Ad-Hoc 1-Off?
Algorytm zarządzania buforowaniem:
Po wprowadzeniu tej funkcji optymalizacji algorytm zarządzania buforowaniem również został zaktualizowany.
Artykuł Kimberly Tripp odwołuje się również do postu Kalena Delaneya na temat tej zmiany algorytmu.
Wyjaśnia to najlepiej:
Oznacza to, że te nieznośne jednorazowe plany będą dostępne jako pierwsze, gdy trzeba zwolnić zasoby.
Zatem teraz pytanie brzmi:
„ Dlaczego POTRZEBUJEMY„ Optymalizować pod kątem obciążeń ad hoc ”, gdy SQL Server zajmuje się usuwaniem nieużywanych planów, gdy jest to konieczne? ”
Moja odpowiedź na to pytanie, jeśli regularnie masz mnóstwo ton generujących dynamiczne sql nieparametryzowanych reklam -hoc wysyła zapytania, więc warto włączyć tę funkcję.
Chcesz uniknąć obciążania zasobów systemowych, tak że wymusza to usunięcie planu buforowanego / danych po zużyciu maksymalnej pamięci w pamięci podręcznej.
Skąd mam wiedzieć, kiedy muszę to włączyć?
Oto zapytanie, które napisałem, aby pokazać, ile aktualnie masz planów buforowanych Ad-Hoc i ile miejsca na dysku zjadają (wyniki będą się zmieniać w ciągu dnia - przetestuj je w czasie dużego obciążenia):
Wyniki:
Nie powiem „ kiedy masz X MB ” lub „ jeśli X% twoich ad hoc jest jednorazowych ”, aby to włączyć.
Nie wpływa na Sprocs, wyzwalacze, widoki ani sparametryzowany / przygotowany SQL - tylko zapytania Ad-Hoc.
Osobiście zalecam, aby włączyć się w środowisku Prod, ale rozważ pozostawienie tego w środowisku deweloperów.
Mówię to tylko dla deweloperów, ponieważ jeśli optymalizujesz zapytanie, które zajmuje minutę lub dłużej, nie chcesz uruchamiać go 3 razy, zanim zobaczysz, jak szybko pójdzie z nim w pamięci podręcznej - co jednorazowo edytujesz go, aby znaleźć najlepszy projekt optymalizacji.
Jeśli twoja praca nie polega na robieniu tego przez cały dzień, zwariuj i poproś DBA o włączenie go wszędzie.
źródło
„Dlaczego NIE powinienem używać…” W trakcie niektórych badań wydajności wyciąganie planów z pamięci podręcznej planów w czasie rzeczywistym, podczas obserwowania wykorzystania zasobów może być bardzo pomocne. „Optymalizuj pod kątem obciążeń adhoc” może to zakłócić, ponieważ plany pośredniczące adhoc nie zwrócą planu podczas zapytania do pamięci podręcznej. W takim przypadku, jeśli zapytania i planu nie można zidentyfikować w inny sposób, ustawienie można wyłączyć i włączyć ponownie w celu przeprowadzenia dochodzenia. Zauważ, że zmiana w ustawieniach zapytań o efekty skompilowana od tego momentu. Ponadto za każdym razem, gdy zmieniasz właściwość „serwer”, sprawdź instancję nonprod w tej samej wersji, aby sprawdzić, czy zmiana opróżni pamięć podręczną planu. Osobiście nienawidzę być tym zaskoczonym. (Na przykład zmiana maxdop na poziomie serwera zwykle opróżnia pamięć podręczną planu,
„Do skompilowanego kodu pośredniczącego planu nie jest powiązany plan wykonania, a zapytanie o uchwyt planu nie zwróci XML Showplan.” http://technet.microsoft.com/en-us/library/cc645587.aspx
źródło