Blog > Komentarze do wpisu
Oracle RAC i 'losowe' sekwencje

 

Przenieśliśmy właśnie naszą developerską bazę danych do środowiska Oracle RAC.
Testując jedną z aplikacji zaobserwowałem 'dziwne' zachowanie sekwencji. Wystarczy zerknąć na poniższe screenshoty i dane w pierwszym i ostatnim wierszu (przykładowo, jest ich tam więcej :).


Sekwencje i Oracle RAC

 

Wyniki wykonanego zapytania posortowane są malejąco po kolumnie logcreated (wartość domyślna aktualny time stamp). Wartości w kolumnie logid wypełniane są wartościami sekwencji:



CREATE SEQUENCE LOGID;



Co w rezultacie, po uwzględnieniu wartości domyślnych bazy Oracle, prowadzi do:



CREATE SEQUENCE LOGID
  START WITH 1
  MAXVALUE 999999999999999999999999999
  MINVALUE 1
  NOCYCLE
  CACHE 20
  NOORDER;



Niestety nasze zespół QA zawiódł na całej linii. Nie powinien on dopuścić do stworzenia takiej sekwencji, ale to zupełnie inna historia :).



Jak widać, wartości w kolumnie logid wyglądają na przydzielane losowo. Początkowo myślałem, że to bug w moim kodzie, ponieważ byłem na etapie modyfikacji jednej z powiązanych funkcjonalności programu. Problemem są tu jednak wartości domyślne Oracle wykorzystywane przy tworzeniu sekwencji. Domyślnie sekwencje są nieposortowane i cache-owane jest 20 kolejnych wartości.



W środowisku RAC, każdy z węzłów ma swój własny cache dla sekwencji, co może prowadzić, jak w powyższym przykładzie do wartości ‘losowo wyglądających' numerów sekwencji.



Wszystko to jest dobrze udokumentowane i absolutnie nie twierdze ze to błąd bazy, raczej niedopatrzenie ze mojej strony :) [osobiście uważam, że domyślnie sekwencje powinny być tworzone jako posortowane].



Brak poprawnej kolejności wydaje mi się nieintuicyjny szczególnie, gdy w tabeli posiadamy również znacznik czasu utworzenia rekordu. Może też prowadzić do trudnych do zdiagnozowania błędów w aplikacji. W moim wypadku prowadziło to do wyświetlania niewłaściwych danych dla użytkownika.

Wykorzystywałem max(logid) oraz sortowanie malejące po tejże kolumnie dla odpowiednio pobrania ostatnio wykonanej czynności i wyświetlenia w kolejności chronologicznej (desc) historii operacji (wiadomo... sortowanie po wartości typu numerycznego jest zawsze szybsze, niż to po dacie, dlatego też, wybór mój padł na tę właśnie kolumnę a nie na kolumnę logcreated).



W moim wypadku zdecydowałem się na zmodyfikowanie sekwencji tak, aby nie korzystały z cache:

 

ALTER SEQUENCE LOGIDNO NOCACHE;



Na razie wszystko jest ok, nie testowałem jedynie wydajności tego rozwiązania w porównaniu do posortowanej, cache-owanej sekwencji.

 

Jeśli polegasz na kolejności sekwencji musisz zwrócić uwagę na to jak dokładnie tworzysz swoją sekwencje.



piątek, 11 maja 2012, m0rt1m3r

Related Posts Plugin for WordPress, Blogger...

Polecane wpisy





PowerBuilder Tetris
D - Tetris



Programowanie iOS

C# ToolBox

SQL / TSQL / PLSQL ToolBox

Linux / Unix ToolBox





Zaprzyjaznione Strony

Sprite Bandits

Cake Time