Jak automatycznie odświeżać widoki w Netezza?

Problem

Masz istniejący schemat bazy danych, biznes prosi, żeby dodać jeszcze jedną kolumnę w tabeli.

Pomyślisz bułka z masłem.

Jest tylko jedna kwestia, o której warto pamiętać, gdy pracujesz z Netezza.

Gdy zmienisz strukturę tabeli wtedy Netezza unieważnia (?) (invalidates) wszystkie widoki, które mają choćby złączenia do tej tabeli. Oznacza to, że nie możesz czytać z tego widoku.

Czyli wszystkie zasilania, które czerpały z tego widoku albo raporty, które się do niego odwoływały przestają działać.

Co można zrobić, żeby przeciwdziałać tej katastrofie? Jak odświeżać widoki w Netezza? Najlepiej automatycznie.

Jak odświeżać widoki w Netezza? Rozwiązanie!

Weź wszystkie definicje widoków. I jeszcze raz je przebudujmy.

Tylko skąd wziąć te definicje?

Z zewnętrznego repozytorium z widokami (np. PowerDesigner)? Najprawdopodobniej to nie jest najlepszy pomysł.

Najlepiej ze schematu, na którym obecnie pracujesz.

Czyli jeżeli zmieniasz na DEV (development) to stamtąd bierzesz definicje. Jeżeli przenosisz na produkcję to wtedy z tamtego schematu.

Netezza dostarcza funkcję:

get_viewdef(‘view_name’);

Przy jej użyciu możesz pobrać ze schematu definicję widoków.

No dobrze. Ale co jeżeli tych widoków masz już ponad 128?

Wtedy przydatna staje się jeszcze widok systemowy:

_v_views 

Z którego możesz sobie wylistować wszystkie widoki.

Mniej więcej w ten sposób:

SELECT get_viewdef(‘view_name’) FROM _v_views WHERE view_name LIKE ‘V%’;

Wynik zapytanie to wszystkie skrypty, widoków. Oczywiście zawężanie listy zależy tylko od Twoich potrzeb i fantazji.

Zaletą tego rozwiązania jest wydajność.
Odświeżenie 128+ widoków to mniej więcej 8 sekund (WOW)!
Powiedzieć, że to jest szybkie, nic nie powiedzieć. To jest niewiarygodnie szybkie rozwiązanie!

Teraz pytanie do Ciebie, drogi czytelniku. Co zrobisz w przypadku gdy to nie Ty zmieniłeś widok, tylko zmiany zrobił inny zespół i tak się niefortunnie stało, że zapomniał Cię poinformować o tym?

W jaki sposób można zbudować rozwiązanie, które:

  • automatycznie
  • każdego dnia odświeża widoki?

Jakiego jeszcze komponentu Netezza można użyć? Moja odpowiedź na końcu wpisu.

Jak odświeżać widoki w Netezza? Czy można inaczej?

Oczywiście, że można. I sprawdzimy, też tę ścieżkę, tylko ostrzegam DBA nie będzie zadowolony, żę poszedłeś tą drogą.

Czy znasz sposób w Netezza, żeby automatycznie sprawdzić wszystkie widoki, które są w stanie “invalid”?

Jeżeli znasz jedno miejsce, żeby to zrobić to daj mi znać.

Ja znalazłem taki sposób:

SELECT 1 FROM view_name limit 0;

Piękne zapytanie.

Jest tylko jedno ale. Wydajność 🙁

Gdy masz tych widoków do sprawdzenia wiele i są to widoki złożone (wiele złączeń/joinów i funkcji analitycznych).

SELECT 1 FROM view_name limit 0 union all
SELECT 1 FROM view_name_1 limit 0 union all
SELECT 1 FROM view_name_2 limit 0 union all
…
…
...
…
SELECT 1 FROM view_name_128 limit 0;

To jest bardzo obciążające dla bazy danych. DBA nie jest zadowolony widząc takie zapytanie, zabierasz niepotrzebnie zasoby i możesz doprowadzić admina do przegrzania albo podnieść mu niepotrzebnie ciśnienie.

Dlatego rozwiązanie opisane powyżej odświeżające definicje widoków jest rekomendowanym rozwiązaniem.

I możesz spokojnie chodzić z DBA na kawę.

Ps. Żeby zrobić tą pracę automatycznie użyj komendy nzsql i wywołaj skrypt, który odbudowuje widoki. Możesz potem tę komendę obudować skryptem shellowym i uruchamiać z poziomu unixa.

2 Thoughts to “Jak automatycznie odświeżać widoki w Netezza?”

  1. To są właśnie ciekawostki Netezzowe na które warto znaleźć sobie jakieś lekarstwo, bo w dużych hurtowniach, na których pracują zespoły ludzi korzystające nawzajem ze swoich danych, trudno jest wyłapać zależności i wydobyć informację co ma zostać odbudowane.
    Na ten przypadek z większą liczbą widoków do odbudowania można zastosować nastepujące rozwiązanie:
    1. Tworzymy zapytanie wykorzystujące wszystkie widoki do odbudowania (list można wziąć z _v_view): SELECT 1 FROM VIEW_NAME_1, VIEW_NAME_2, … , VIEW_NAME_3 WHERE 1=0
    2. Odpalamy i zczytujemy komunikat błędu, w którym najczęściej jest nazwa widoku do odbudowania.
    3. Pobieramy z tabeli DDL widoku i ją odpalamy.
    4. Jeżeli nie da się odbudować widoku (sprawdzenie tego jest może bardziej skomplikowane bo trzeba określić z jakiego typu błędem mamy do czynienia) to po prostu usuwamy go z zapytania w pkt. 1 zapisując jednocześnie do loga, że informacje z nazwą widoku i błędem.
    Punkty 2-4 odpalamy aż nasze skonstruowane zapytanie nie będzie zwracać błędu 🙂
    Wiadomo, żeby uzyskać w pełni funkcjonalne rozwiązanie trzeba rozważyć różne przypadku w skrypcie ale też nie jest ich zbyt wiele.
    Pozdrawiam

    1. admin

      Dzięki za ten ciekawy pomysł, jak usprawnić skrypt.
      Taka automatyzacja sprawia, że codzienne życie staje się przyjemniejsze a błędów na produkcji jest znacznie mniej.

Leave a Comment