Wpis z mikrobloga

#programowanie #bazydanych #nosql
Witam Mireczków, interesuje mnie rozwiązanie pewnego problemu, który przedstawię na prostym przykładzie. Na przykład bierzemy bank, gdzie mamy klienta oraz jego przychody i wydatki. Zakładając, że mamy 100 000 klientów i każdy z nich wykona średnio 200 transakcji to mamy 20 000 000 rekordów w tabeli. Chyba zgodzicie się, że przeszukanie takiej tabeli jest bardzo czasochłonne, więc jak to zrobić by miało RENCE I NOGI.

Na obecny stan mój wiedzy wydaje mi się, że najłatwiej było by to zrobić w NoSQL, ale interesuje mnie rozwiązanie w relacyjnej bazie danych.
  • 34
@nihilm a banki stać na dobre serwery :p
A tak serio to szczerze nie wiem jak to rozwiązują, strzelam, że w bazie maja tylko część rekordów (np. 2 lata), a resztę archiwizują i mają do tego bazy w trybie read only.
@nihilm: Tak jak piszą koledzy wyżej. Wyszukiwanie działa szybko póki indeks mieści się w pamięci RAM. Aktualnie serwery potrafią mieć 256GB pamięci RAM.

Jeśli dalej jest problem i nie możemy go rozwiązać archiwizacją, to możemy wykorzystać np. sharding.
@nihilm: Poczytaj o partycjonowaniu tabeli.
Dzięki temu rozwiązaniu logicznie jest np. jedna tabela z transakcjami, ale transakcje są miesiącami porozrzucane na osobnych tablespace, a co za tym idzie osobnych storage czy nawet całych instancjach. Dzięki temu szukani transakcji w danym miesiącu - już powoduje szukanie tylko w jednym miejscu wg jednego "małego" indexu.

Jest to rozwiązania m.in oracla w wersji enterpice i z tego się korzysta.
@Supaplex: Partycjonowanie wg dat nie ma tu większego sensu, bo nie ma sensu nigdy szukać wg dat bez wskazania użytkownika. Bank to taki przypadek, że jeden użytkownik widzi dane tylko swoje - i nigdy nie przegląda jakiegoś ogólnego widoku "pokaż transakcje wszystkich klientów banku z poprzedniego miesiąca". Analizy można odpalać na archiwalnej kopii tutaj.

Partycjonowanie wg użytkowników i primary key na numer transakcji albo datę zlecenia.
Chyba zgodzicie się, że przeszukanie takiej tabeli jest bardzo czasochłonne, więc jak to zrobić by miało RENCE I NOGI.


@nihilm: Relacyjna baza danych (nie noSQL) i indeks. Możesz mieć setki milionów rekordów i nadal wyszukiwanie transakcji danego klienta to zagadnienie na kilka milisekund.

Wyszukiwanie działa szybko póki indeks mieści się w pamięci RAM.


@Ununoctium: Indeks nie musi mieścić się w całości w pamięci RAM.
@Ununoctium: oczywiscie ze najlepiej ogolnie jak cala zmiesci sie w RAM ale w ram zawsze sa i bloki z indeksami i z danymi najczesciej nie masz kontroli nad tym ile blokow indeksow i ile blokow danych jest tam aktualnie. Najzadziej uzywane po prostu wypadaja z cache.

Poza tym by siegnac so konkretnego rekordu nie trzeba skanowac calego indeksu.
@maniac777 By po prostu sięgnąć nie, ale są operacje wymagajace full scanu. Poza tym raczej nie chcemy wchodzić w technikalia zarządzania pamięcią, bo każdy DBMS ma swoje mechanizmy, a nie to było przedmiotem pytania.

Po prostu używam uproszczeń, nikogo chyba nie wprowadziłem w błąd?
By po prostu sięgnąć nie, ale są operacje wymagajace full scanu


@Ununoctium: sa ale powinno sie ich unikac tak samo jak pelnego skanu tabeli.

Po prostu używam uproszczeń, nikogo chyba nie wprowadziłem w błąd?


W mojej ocenie wprowadziles tu:

Wyszukiwanie działa szybko póki indeks mieści się w pamięci RAM.


Wyszukiwanie po indeksie dziala o wiele rzedow wielkosci wydajniej bez wzgledu na to czy zmiesci sie on w RAM czy nie.

Obrazowo:
@nihilm: Nie waż się wsadzać NoSQL do projektu jeśli nie jesteś specjalistą od baz relacyjnych. NoSQL ma swoje zastosowania ale to nie jest jedno z nich.


@plushy: ZWŁASZCZA tutaj, przy operacjach finansowych, gdzie jak słyszy się o braku ACIDu i eventual consistency to właśnie jakiś gruby dyrektor schodzi na zawał.
Wyszukiwanie po indeksie dziala o wiele rzedow wielkosci wydajniej bez wzgledu na to czy zmiesci sie on w RAM czy nie.


@maniac777: Jak już mamy wchodzić w technikalia to nie zawsze działa szybciej ale z reguły tak.