Wpis z mikrobloga

Mirki, testuję zmiany wydajnościowe widoku i jego pochodnych na bazie Oracle 12c.
Na tej jednej bazie oprócz schematu, który wykorzystuje jest sporo innych, z dużą ilością danych.
Obiekty, które modyfikuje są unikatowe, tj. nie ma ich na innych schematach.

Ponieważ dokonuję wielu zmian i po każdej zmianie pragnę przetestować wprowadzone zmiany, to generuję kolejne plany zapytań, żeby dostrzec różnicę "na pierwszy rzut oka".

Problemem jest niestety Oracle'owe cache'owanie. Mimo kolejnych zmian najczęściej plan jest identyczny jak wcześniej, a samo wykonanie polecenia select * from view przyspiesza po pierwszym razie ze względu na dane tymczasowe bazy.

Jak mogę wyczyścić cache TYLKO w ramach jednego schematu?
Potrzebuję puścić coś w stylu:
alter system flush buffercache; --> to jest część SGA, stąd moje obawy o ruszenie cache z innych schematów...
alter system flush shared
pool;

Chyba, że te polecenia będą się odnosiły tylko do usera, na którym polecenia są wykonywane.
Ktoś coś więcej wie na ten temat? Potrzebuję jakiejś dokumentacji/obejścia tego cache.

#sql #programowanie #programista15k #oracle #plsql #bazydanych
  • 5
  • Odpowiedz
@Best11: Raczej stopień zbuforowania danych w danym momencie nie ma wpływu na generowane plany. Poza tym używanie czasu wykonania do sprawdzenia jakości zmian nie jest dobre, bo oprócz zbuforowania mogą też zmieniać się obciążenia bazy przez innych użytkowników. Lepiej minimalizować ilość "buffer gets" z wykonania - to jest niezależne od dwóch powyższych czynników. A jak przypadkiem nie ma żadnych innych użytkowników, to co szkodzi wyczyścić cały bufor? :)
  • Odpowiedz
@w__k: To jest dobre pytanie. Ale czy przypadkiem bufor nie służy do przechowywania między innymi planów zapytań często wykonywanych na bazie? tzn. mimo tego, iż aktualnie nie ma użytkowników i jutro również, to pojawią się np. w poniedziałek. Wtedy buffor będzie już wyczyszczony przeze mnie i zapytania raz zbuforowane będą musiały na nowo przejść etap query transformation/optimization. Czyż nie?
Buffor nie jest chyba bardzo chwilowy, tylko pozwala na przechowywanie danych dłużej
  • Odpowiedz
@Best11: Żeby "zinvalidować" plan zapytania wystarczy strzelić kilka razy granta na obiektach z których korzysta zapytanie polecam sprawdzić;)

I nie trzeba flushować niczego wtedy
  • Odpowiedz