Nierzadko spotykamy się z problemem gwałtownego pogorszenia wydajności starej, wielokrotnie sprawdzonej i zoptymalizowanej aplikacji. Przyczyną zwykle jest upgrade oprogramowania serwera bazy danych, zmiana sposobu zbierania statystyk dla optymalizatora zapytań, rekonfiguracja optymalizatora zapytań czy zmiana ustawień systemowych. Czy można jakoś uchronić się przed takimi wydajnościowymi niespodziankami w przyszłości?
Istnieje mechanizm serwera bazy danych Oracle Database umożliwiający ochronę dobrych, wydajnych planów wykonania zapytań przed gwałtownym pogorszeniem w wyniku zmian systemowych – SQL Plan Management. Zastępuje on wcześniejsze rozwiązanie – Stored Outlines. Idea działania SQL Plan Management polega na sporządzeniu zbioru „akceptowalnych” planów wykonania danego zapytania SQL (tzw. SQL Plan Baseline), a następnie na niewykraczaniu przez optymalizator poza ten zbiór. Gromadzenie „akceptowalnych” planów wykonania zapytania może przebiegać automatycznie – serwer porównuje każdy nowy plan z najlepszym znajdującym się w SQL Plan Baseline i gdy jest lepszy, to dodaje go do SQL Plan Baseline (OPTIMIZER_CAPTURE_SQL_PLAN_BASELINES = TRUE) – lub manualnie – użytkownik wskazuje plany, które powinny znaleźć się w SQL Plan Baseline (DBMS_SPM.LOAD_PLANS_FROM_CURSOR_CACHE( sql_id => '…’)).
Gdy optymalizator zapytań przystępuje do realizacji kolejnego polecenia SQL, generuje „optymalny” plan wykonania, po czym sprawdza, czy taki plan znajduje się w SQL Plan Baseline dla tego polecenia SQL. Jeśli tak, to go stosuje, jeśli nie, to wybiera najlepszy spośród planów w SQL Plan Baseline (OPTIMIZER_USE_SQL_PLAN_BASELINES = TRUE). Na potrzeby przyszłych analiz taki nieudany „optymalny” plan jest zapisywany w tzw. historii planów dla zapytania.
Oczywiście komentarza wymaga kwestia oceniania planów wykonania przez optymalizator. Czy odbywa się to na podstawie kosztów? Nie, nie miałoby to sensu, gdyż cały ten mechanizm został wprowadzony właśnie dlatego, że przewidywane koszty potrafią kłamać. Ocena (ewaluacja) planów wykonania na potrzeby SQL Plan Management odbywa się eksperymentalnie (DBMS_SPM.EVOLVE_SQL_PLAN_BASELINE(sql_handle => '…’)).
I jeszcze ciekawostka – plany należące do SQL Plan Baseline mogą być przenoszone pomiędzy bazami danych (np. produkcyjną i deweloperską) – służy do tego celu pakiet DBMS_SPM.
Więcej na temat SQL Plan Management: http://docs.oracle.com/cd/E11882_01/server.112/e16638/optplanmgmt.htm#PFGRF007