Wpis z mikrobloga

Pytanie do mirków z #sql i #programowanie
Zauważyłem niedawno, że szybko puchnie mi baza danych. Postanowiłem to sprawdzić. Zapytałem bazę ile poszczególne tabele ważą i tutaj nastąpiło moje zdziwienie bo taka tabela z 20 000 wierszy waży 3,3 MB. Trochę dużo. Wyeksportowałem tabelę do pliku CSV i taki plik zajmuje mi już 1,1 MB. Możecie mi powiedzieć czemu w bazie zajmuje mi to tak dużo miejsca? Da się to jakoś zoptymalizować?

Zastanawiam się teraz nad celowością używania SQL w moich aplikacjach. Niby fajny dostęp i wydajność, ale dość dużym kosztem zajmowanego miejsca.
  • 20
@Kicer86: Każdy z wierszy dodawany jest mniej wiecej co sekunde. Nie są modyfikowane. Dopiero jak wpiszę określoną ilość wierszy, w ostatniej kolumnie zmieniam w niektórych wierszach wartość z 0 na 1. I potem już nie są modufikowane a tylko wyświetlane.
@debesciak1: 3-krotnie większa objętość bazy w stosunku do plantextu nie jest Twoim problemem. Nawet gdyby baza zajmowała tyle, co csv, to miałbyś już jakieś 700MB. Baza SQLExpress po prostu i tak nie jest dla ciebie wystarczająca, bo niedługo byś ją zapełnił. Także odpowiadanie na Twoje pierwotne pytanie o optymalizację nie ma znaczenia.

Rozwiązanie problemu natomiast będzie zależne o tego, jakie dane tam masz i co z nimi robisz. Najprościej byłoby zmienić
3 MB i się przejmujesz? Wołaj jak dojdziesz do kilku GB.

Takich tabel mam setki a będą tysiące


@debesciak1:

1. Jak masz setki czy tysiące tabel, to coś robisz źle.
2. 3,3 MB x 2000 = 6,6 GB – na pendrajwie zmieścisz

Serio, nie wiem na czym polega problem. Dyski są tanie, procesory szybkie, a sieci przepustowne.
@MacDada: SQL ma tą zaletę, że jednocześnie do danych może dobierać się wiele osób czy to po sieci czy programy lokalnie. Normalnie bym trzymał to w plikach. 2000 to mało. Tyle danych w niecały rok zbiorę. A zależy mi żeby dane były w bazie przynajmniej 3 lata. SQL Server w wersji Express ma ograniczenie do 10GB.

@zjadak: Teraz nie mam dostępu do programu, ale log był w porządku.

Chyba pozostaje
2000 to mało.


@debesciak1: 2000 tabel to mało? Po co tyle tabel produkujesz? Mam wrażenie, że gdzieś masz błąd w dizajnie.

SQL Server w wersji Express ma ograniczenie do 10GB.


@debesciak1: To może jednak darmowy i wypasiony Postgres?

Maximum Table Size 32 TB
Maximum Row Size 1.6 TB
Maximum Field Size 1 GB
Maximum Rows per Table Unlimited
Maximum Columns per Table 250 - 1600 depending on column types
@MacDada: danych jest ogrom, dlatego też tyle tabel. Albo setki tysiecy rekordów w jednej tabeli albo te 2000 tabel i max 30 000 rekorodów w nich. Z dobieraniem się do danych nie mam najmniejszego problemu, więc dizajn jest ok. Co najwyżej mógłbym porobić odniesienia i trochę miejsca zaoszczędzić.
@MacDada: składnia zapewne jest inna w Postgres?
danych jest ogrom, dlatego też tyle tabel. Albo setki tysiecy rekordów w jednej tabeli albo te 2000 tabel i max 30 000 rekorodów w nich.


@debesciak1: 30k rekordów to jest nic. Na MySql trzymamy po kilka(naście) milionów rekordów. Twoje ograniczenie wynika z ograniczeń bazy danych ;)

składnia zapewne jest inna w Postgres?


Zależy co używasz. To jest baza SQL. Trzyma się standardów. I oczywiście buduje ponad standardy swoje bajery.

MS z
@debesciak1: Generalnie nigdy nie korzystałem z bazki MS, ale też nie widzę powodu.

Na produkcji używamy wszędzie MySQL (+odmianę w postaci serwera Percona) i w jednym projekcie Mongo. Na studiach korzytałem z PostgreSQL i generalnie czytam na temat tej bazki przeważająco pozytywne opinie.

Tak więc w pracy nowe projekty stawiamy na MySQL (bo mamy opanowaną infrastrukturę), a jakbym robił jakiś projekt dla siebie, to bym wziął PostgreSQL. Czemu miałbym płacić za
@debesciak1:
Albo wielkość logu.
Albo wielkość indeksu.
Albo nieoptymalnie wielkie pola.

Niby mówisz, że będziesz generował tabele żeby uzyskać podział danych. Tylko takie rzeczy załatwiają indeksy. Dzięki temu baza jest human-readable a nie wygląda jak kupa śmieci.