| Termin | Definicja |
|---|---|
| Przechowywanie planu wykonania | Przechowywanie planu wykonania w pamięci podręcznej pozwala uniknąć ponownej kompilacji przy kolejnych wywołaniach zapytania. Przechowywanie planu wykonania – czym jest i czemu służyPrzechowywanie planu wykonania oznacza zachowanie informacji o sposobie realizacji zapytania, aby przy następnym użyciu nie trzeba było ponownie analizować całej instrukcji. Zanim baza danych zwróci wynik, musi ustalić kolejność operacji, sposób odczytu danych, wykorzystanie indeksów, metody łączenia tabel oraz przewidywaną liczbę przetwarzanych wierszy. Taki zestaw decyzji tworzy plan wykonania. Jeżeli identyczne albo odpowiednio przygotowane zapytanie pojawia się wiele razy, ponowne wykonanie etapu optymalizacji może być zbędnym obciążeniem. Pamięć podręczna planów pozwala zachować gotowy rezultat tego etapu i użyć go ponownie. Nie oznacza to zapisania wyników zapytania. Plan opisuje sposób dojścia do wyniku, ale nie przechowuje samych danych zwracanych użytkownikowi. Po ponownym uruchomieniu instrukcji odczytywane są aktualne dane, a plan może jedynie wskazywać, z jakich struktur i w jakiej kolejności należy skorzystać. Dzięki temu rozwiązanie różni się od pamięci podręcznej wyników, która przechowuje rezultat konkretnego zapytania i musi sprawdzać, czy nie został on zmieniony. Plan może być przechowywany przez określony czas, do momentu zapełnienia pamięci albo do wystąpienia zdarzenia powodującego jego unieważnienie. Mechanizm ten jest szczególnie przydatny przy często powtarzanych zapytaniach, procedurach oraz instrukcjach korzystających z parametrów. Korzyść polega na ograniczeniu pracy optymalizatora, skróceniu czasu przygotowania zapytania i zmniejszeniu liczby operacji pomocniczych wykonywanych przed właściwym odczytem danych. Przechowywanie planu wykonania w kontekście optymalizacji i porównańOptymalizator nie wybiera planu przypadkowo. Analizuje statystyki dotyczące rozkładu wartości, rozmiaru tabel, dostępnych indeksów oraz warunków zapisanych w zapytaniu. Może zdecydować, że właściwy będzie pełny odczyt tabeli, wyszukiwanie po indeksie, sortowanie, grupowanie albo połączenie kilku źródeł danych określoną metodą. Przy każdym nowym tekście zapytania taki proces może zostać wykonany od początku. Magazyn planów pozwala ominąć część tych czynności, o ile zachowane są warunki umożliwiające bezpieczne ponowne użycie. W praktyce trzeba odróżnić trzy podobne pojęcia. Bufor danych przechowuje strony z rekordami, więc ułatwia szybki dostęp do informacji już odczytanych z nośnika. Pamięć podręczna planów przechowuje instrukcje dotyczące kolejności i sposobu działania. Pamięć podręczna wyników przechowuje gotowy rezultat. Te warstwy mogą współpracować, lecz każda odpowiada za inny etap realizacji zapytania. Szybki odczyt danych nie gwarantuje szybkiego przygotowania planu, a zachowany plan nie sprawi, że wynik pozostanie aktualny bez ponownego sprawdzenia danych. Warto także porównać zapytania tworzone dynamicznie z zapytaniami parametryzowanymi. Jeżeli wartości są wstawiane bezpośrednio do tekstu instrukcji, każda zmiana może zostać potraktowana jako nowy tekst i doprowadzić do utworzenia kolejnego wpisu w pamięci podręcznej. Przy parametrach struktura zapytania pozostaje taka sama, a zmieniają się tylko wartości wejściowe. Taki model zwykle ułatwia ponowne użycie planu, ogranicza liczbę podobnych wpisów i pomaga zachować bardziej przewidywalne zużycie pamięci. Nie każdy plan powinien jednak obowiązywać bezterminowo. Plan optymalny dla małej tabeli może stać się niekorzystny po dużym przyroście danych. Podobnie zmiana rozkładu wartości może spowodować, że indeks używany wcześniej przestanie być najlepszym wyborem. Dlatego system bazodanowy potrzebuje mechanizmów odświeżania statystyk, unieważniania planów i ponownej optymalizacji. Przechowywanie planu wykonania a typowe problemy w działaniu bazy danychJednym z częstych problemów jest nadmierne nagromadzenie planów. Może do niego dojść wtedy, gdy aplikacja generuje wiele prawie identycznych instrukcji różniących się jedynie wartościami wpisanymi bezpośrednio w tekst. Każda wersja może zajmować miejsce, mimo że logicznie wszystkie zapytania wykonują tę samą czynność. Skutkiem bywa szybsze wypieranie użytecznych planów, większa liczba operacji optymalizatora i trudniejsza analiza obciążenia. Innym problemem jest ponowne użycie planu dobranego na podstawie nietypowego zestawu parametrów. Jeżeli pierwsze wykonanie dotyczy wartości występującej bardzo rzadko, optymalizator może wybrać wyszukiwanie po indeksie. Dla wartości występującej w większości rekordów korzystniejszy może być natomiast odczyt większego zakresu danych. Gdy jeden plan zostanie zastosowany do obu przypadków, czas wykonania może znacznie się różnić. Zjawisko to bywa określane jako wrażliwość planu na wartości parametrów. Na ponowne użycie planu wpływają także zmiany struktury danych. Dodanie, usunięcie lub przebudowanie indeksu, modyfikacja tabeli, zmiana typów kolumn albo aktualizacja statystyk może sprawić, że wcześniejsze założenia przestaną być aktualne. W takich sytuacjach plan powinien zostać oznaczony jako nieaktualny. Jeżeli mechanizm odświeżania działa nieprawidłowo albo statystyki są przestarzałe, objawem może być zapytanie, które dawniej działało sprawnie, lecz z czasem zaczęło zużywać więcej zasobów. Trzeba uwzględnić również różnice między środowiskiem testowym a produkcyjnym. Mały zbiór danych, inne statystyki, odmienna konfiguracja pamięci lub różny poziom równoległości mogą prowadzić do wyboru innych planów. Sam fakt, że zapytanie działa szybko w jednym miejscu, nie potwierdza poprawności tego samego planu w każdym przypadku. Ocena powinna obejmować rzeczywiste parametry, rozmiar danych, częstotliwość wywołań oraz czas przygotowania i wykonania. Przechowywanie planu wykonania – praktyczne wskazówki dla projektowania zapytańPodstawą jest stosowanie parametryzacji wszędzie tam, gdzie zapytania są powtarzalne i różnią się głównie wartościami wejściowymi. Ułatwia to rozpoznanie wspólnej struktury instrukcji oraz ogranicza niepotrzebne tworzenie kolejnych planów. Parametryzacja ma również znaczenie dla bezpieczeństwa, ponieważ wartości nie muszą być sklejane z tekstem zapytania. Nie zwalnia to jednak z obowiązku prawidłowego sprawdzania danych wejściowych i kontroli uprawnień. Warto obserwować zarówno czas kompilacji planu, jak i czas właściwego wykonania. Gdy przygotowanie planu jest długie, a instrukcja uruchamiana często, pamięć podręczna może przynieść wyraźną korzyść. Jeżeli natomiast zapytanie jest wykonywane rzadko, koszt przechowywania planu może nie mieć większego znaczenia. Analiza powinna uwzględniać liczbę wywołań, częstotliwość zmian danych, zajętość pamięci oraz rozmiar planów. Pomocne jest rejestrowanie planów i porównywanie ich w czasie. Należy sprawdzać, czy używany jest właściwy indeks, ile rekordów zakłada optymalizator, ile rekordów rzeczywiście przechodzi przez poszczególne operacje oraz gdzie powstają sortowania lub kosztowne połączenia. Różnica między wartościami szacowanymi a rzeczywistymi może wskazywać na nieaktualne statystyki, nietypowy rozkład danych albo niewłaściwe parametry. Nie zaleca się ręcznego wymuszania planu bez wcześniejszego rozpoznania przyczyny problemu. Wymuszony wariant może poprawić czas wykonania jednego przypadku, ale pogorszyć inne przypadki lub stać się nieaktualny po zmianie danych. Bezpieczniejsze podejście obejmuje aktualizację statystyk, przegląd indeksów, ograniczenie zbędnych kolumn, poprawę warunków filtrowania i sprawdzenie parametryzacji. Dopiero później można ocenić, czy potrzebne są dodatkowe mechanizmy kontroli planu. Znaczenie ma także projekt aplikacji. Powtarzające się instrukcje powinny mieć spójną postać, a połączenia z bazą danych nie powinny niepotrzebnie inicjować nowych procesów przygotowania. Warto ustalić, które zapytania są krytyczne, jak często się powtarzają i jakie opóźnienie jest akceptowalne. Takie dane pomagają odróżnić problem z planem od problemu z blokadami, przeciążeniem pamięci, wolnym nośnikiem albo nieefektywną logiką aplikacji. Kiedy przechowywanie planu wykonania wymaga konsultacji serwisowejDo analizy warto zgłosić się wtedy, gdy czas odpowiedzi zmienia się bez widocznej modyfikacji kodu, to samo zapytanie raz działa płynnie, a innym razem wyraźnie wolniej, albo po wzroście liczby danych pojawiają się opóźnienia. Sygnałem ostrzegawczym może być również szybkie zapełnianie pamięci, powtarzające się kompilowanie tych samych instrukcji, duża liczba podobnych planów oraz rozbieżność między szacowaną a rzeczywistą liczbą rekordów. Przed przekazaniem sprawy dobrze przygotować opis objawu, przykładowe zapytanie bez poufnych danych, częstotliwość jego uruchamiania, przybliżony moment pojawienia się problemu oraz informację o ostatnich zmianach w aplikacji lub strukturze bazy. Przydatne są także zrzuty planu wykonania, dzienniki czasu odpowiedzi i dane o wykorzystaniu zasobów. Nie należy przekazywać haseł ani pełnych kopii danych, jeżeli nie jest to konieczne do diagnozy. W Warszawskim Pogotowiu Komputerowym 24/7 można rozpocząć od uporządkowania objawów i wskazania, czy trudność dotyczy przygotowania planu, odczytu danych, indeksów, blokad czy konfiguracji aplikacji. Takie rozróżnienie pomaga dobrać dalsze działania do rzeczywistej przyczyny, zamiast ograniczać się do usuwania pojedynczego symptomu. Przechowywanie planu wykonania może przyspieszyć powtarzalne zapytania, lecz najlepsze rezultaty daje dopiero połączenie prawidłowej parametryzacji, aktualnych statystyk, właściwej struktury danych i regularnej obserwacji zachowania systemu. |