Wypowiedzi
-
Krzysztof P.:
Dlaczego wykładniczo ? Według mnie obciążenie będzie stałe. Wystarczy zauważyć, że zapytanie zwracające ostatni zapis dla cudaka praktycznie wyciąga dane z indeksu, który pilnuje spójności tablicy. Używałem kilku motorów bazy danych (INFORMIX, ORACLE, SQLServer), i w takich przypadkach motor bardzo sprawnie wybiera dane. Niestety nie potrafię powiedzieć jak powyższe zachowuje się w POSTGRESQL, bo nie znam tego silnika. Po za tym nie wiemy jaką wydajność docelową ma przyjąć rozwiązanie. Jeśli powyższych INSERT'ów jest niewiele, to rozwiązanie które wskazałem może być wystarczające dla pytającego.
Piotr Ziemian:
Nad wydajnością rozwiązania pomyślałbym dopiero jak powyższe okazałoby się wąskim gardłem.
Bardzo szybko zacząłbyś o tym myśleć, bo wydajność będzie spadać niemal wykładniczo :) -
Ja zrobiłbym to tak (to nie jest język programowania, tylko zarys rozwiązania):
a) na początek dodałbym indeks co by baza się "pilnowała":
CREATE UNIQUE INDEX i00server_commands ON server_commands(idcudaka,idpolecenia)
b) w procedurze wykonałbym sekwencję poleceń (najlepiej w transakcji)
1. SELECT MAX(idpolecenia) INTO <IDPOLECENIA> FROM server_commands WHERE idcudaka = <IDCUDAKA>
2. <IDPOLECENIA> += 1
3. INSERT INTO server_commands (idpolecenia,idcudaka) VALUES (<IDPOLECENIA>, <IDCUDAKA>)
Jeśli powyższe wykonałoby się z błędem (szczególnie INSERT), to prawdopodobnie trzeba powtórzyć procedurę, bo ktoś inny (w procesie równoległym) "zajął" nam pracowicie określony numer idpolecenia.
c) jeśli postgress ma możliwość tworzenia procedur/funkcji, to może zadziała coś takiego:
INSERT INTO server_commands (idpolecenia,idcudaka) VALUES (getNextIdCudaka(<IDCUDAKA>), <IDCUDAKA>)
gdzie, getNextIdCudaka(a_idcudaka) jest procedurą/funkcją SPL realizującą pierwsze dwa punkty.
Nad wydajnością rozwiązania pomyślałbym dopiero jak powyższe okazałoby się wąskim gardłem.
Pozdrawiam,
Piotr -
Dariusz Szyc:
To może da się znaleźć coś w stylu TRIAL i tę akcje jednorazową wykonać...
szczerze to myślałem o jakimś darmowym rozwiązaniu :)
komercyjnych wiele znalazłem, ale że ta migracja ma być jednorazowa na cały lifetime to uważam, że w jakiś sposób da się uniknąć kosztów.