Temat: PostgreSQL i duża baza danych
Michał Płonka:
Witam,
tworzę system, który będzie "bombardowany" dużą liczbą danych. Może przedstawię poglądową strukturę (nazwy poglądowe):
produkty: 1x bigint, 1x character varying, 2x tsvector, 1x timestamp
produkty_kategorie: 1x bigint, 1x int, 1x smallint
zakupy: 1x serial, 2x bigint, 2x smallint, 1x numeric, 1x timestamp
Z moich obliczeń wynika, że dziennie do tabeli produkty będzie trafiało ok. 590 000 rekordów, co rocznie daje prawie 220 000 000. Każdemu produktowi odpowiadają średnio 4 rekordy w tabeli produkty_kategorie oraz 3 rekordy w tabeli zakupy. Nawet jeżeli moje obliczenia są zbyt optymistyczne (niech będzie 50% wyliczanych wartości) to i tak baza danych wydaje się być (dla mnie) gigantyczna.
Będzie taka, powiedzmy, średnia w porywach do takiej sobie :)
Pytanie zasadnicze: czy PostgreSQL da w tym przypadku radę? Czy macie jakieś doświadczenie przy podobnych liczbach rekordów? Jak to wszystko może działać? Na co zwrócić uwagę?
>
Da radę. Może działać szybko. Może działać wolno. Gwarantuję, że `select * from produkty` oraz `select count(*) from produkty` będzie działać koszmarnie wolno.
Na te pytania się nie da odpowiedzieć, wszystko zależy od tego jak używasz bazę, jaka jest struktura, jaki masz sprzęt i konfigurację.
Zwrócić uwagę możesz na:
- partycjonowanie (
http://www.postgresql.org/docs/8.4/interactive/ddl-par...
- `select count(*)` wymaga skanu sekwencyjnego na tabeli, więc będzie trzeba zrobić sensownie zliczanie co by `select count(*)` się nie odpalało.
- dyski muszą być sensowne
- ramu musi być sporo
- dump & restore będzie zajmować sporo czasu (możesz liczyć raczej godziny niż minuty)
- update istniejących danych bez wpływu na szybkość tych insertów będzie działać jeszcze wolniej (tutaj możesz liczyć to w dniach albo i tygodniach)
- zamiast varchar użyj text, będzie szybciej, przy takiej liczbie danych może zobaczysz różnicę
- maszynka musi być odpowiednia
- taka baza nieco miejsca zajmie, możesz liczyć to w granicach 100-200GB (tak gdybając sobie) więc dyski muszą być odpowiednie, bo migracja na nową maszynę może nieco zająć
- używaj jak najnowszej wersji postgresa, nowsze wersje mają fajniejsze planery
- indeksy muszą być odpowiednie (znaczy się tylko te potrzebne)
- konfiguracja musi być dobrze podkręcona
Reasumując: jak nie wiesz co z tym zrobić, nie masz doświadczenia, a robisz system, który ma działać 24/365 i biznesowo jest baaardzo ważny, to raczej weź dobrego admina i dobrego DBA (znaczy się przeważnie wystarczy DBA, z adminowaniem sprzętem i systemem da sobie radę) i niech oni to przygotują. Inaczej za kilka miesięcy będziesz szukał DBA po nocach, bo nagle system przestanie odpowiadać, baza się wyłączy (normalna rzecz w postgresie jak leci dużo transakcji i jakaś stara transakcja wisi np. 2 miesiące), albo też będzie to wszystko kosmicznie wolno działać. Potem przyjdzie DBA, powie, że OK, zrobi, ale ze względu na sprzęt i ilość danych, będzie to trwało tydzień... a przez ten czas system nie będzie działać :)
Skutki potem są takie jak np. tutaj
http://it.toolbox.com/blogs/database-soup/nothing-is-m....
No i zupełnie zgadzam się z Michałem: możliwe, że potrzebujecie coś zupełnie innego niż normalna baza relacyjna.