To Ty postawiłeś tezę, że bazy danych są nieefektywne i na potwierdzenie pokazałeś jakiś program zupełnie od czapy.
Zamiast stawiać w pytaniu tezę (tj. zadawać pytanie w stylu: "od kiedy przestał Pan bić żonę?"), mogłeś np. spytać:
Ale ja widzę przypadek w którym są nieefektywne, zapytanie trwa 6s a może trwać 1ms - to jedna sprawa.
Druga sprawa jest taka, że w wątku poprzednim zasugerowano mi, iż:
- baza musi przeznaczyć rzędy wielkości instrukcji na dodatkowe obliczenia
- baza musi posortować wyniki, co jest bardzo ciężkie obliczeniowo,
- przerobienie 20mln rekordów to wyzwanie dla bazy,
- i rozmowę przerwano argumentując że program jest śmieszny.
Więc w tym wątku zadałem pytanie: dlaczego baza danych są nieefektywne?
Warto przeczytać poprzedni wątek, wtedy będzie wiadomo skąd taki tytuł tego wątku.
Okazało się, że ani baza nie musi przeznaczać rzędów wielkości na dodatkowe obliczenia, ani sortowanie nie jest takie ciężkie. ani 20 mln rekordów zbuforowanych w RAM nie stanowi żadnego wyzwania dla bazy. Wygląda jedynie na to, że bazy nie zawsze w pełni potrafią wykorzystać możliwości jakie dają b-drzewa.
300-600 ms to bardzo dużo. Przez ten czas baza danych może przejrzeć setki tysięcy a może nawet miliony rowków i to na dysku, a nie w pamięci. Jeśli nie miałeś tam setek MB danych do przejrzenia ani jakiś kosmicznych zapytań na kilka stron ala TPC-H, to raczej winni są (od najbardziej do najmniej prawdopodobnych):
Zależy jak używasz określenia 'może przejrzeć'. Jeśli mamy dysk talrzowy i baza szuka losowo rozmieszczonych danych, to może nie dać rady przejrzeć 100 rekordów w sekundę. Natomiast jeśli mamy dane w pamięci RAM i baza nie przegląda dosłownie, tylko skacze pod właściwe rekordy dzięki indeksom, to może przez sekundę przejrzeć większą pamięć, niż jest sumarycznie na wszystkich komputerach świata.
Co do ilości danych, to chciałbym aby baza wyrabiała się na dowolej ilość danych pod warunkiem że dane i indeksy są całkowicie zbuforowane w pamięci ram, czyli np. gdy komputer będzie miał 1TB pamięci RAM, to bym chcial, aby tamto zapytanie działało w góra 10ms na zbiorze o rozmiarze powiedzmy 0.5TB. Myślę, że to nie jest ciężki wymóg, ale baza musi używać optymalnie indeksów.
słaby programista tj. źle napisana aplikacja, zły model danych, złe zapytania
Jedno zapytanie sql na jednej tabeli, choćbym chciał, to bym nie dał rady spieprzyć. Poza tym na uproszczonej bazie działa ono w 1ms.
słaby administrator bazy tj. zła konfiguracja, źle dobrany sprzęt, brak odpowiednich indeksów / statystyk itp.
TO się zgadza, jestem raczej słabym administratorem bazy danych. Umiem tylko podstawowe opcje ustawić. Ale to właśnie podstawowe są najważniejsze. Nie wiem nic o statystykach postgresa, w tej sprawie bym musiał coś poczytać. Indkesy chyba rozumiem, sam własnoręcznie kiedyś napisałem b-drzew w C++, ale co zrobić aby postgres lepiej korzystał z b-drzew, to też wiem raczej słabo.
łaby lub nieadekwatny system baz danych (tak, widziałem kolesia, który chciał budować system o skali Allegro na PHP i MySQLu na jednym serwerze).
Mato Boska.
U mnie skala zadania, dobór bazy do zadania, są w porządku, o czym świadczy wynik testu na uproszczonej bazie.