Dlaczego bazy danych są nieefektywne?

Dlaczego bazy danych są nieefektywne?
AB
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 8 lat
  • Postów:229
0

W poprzednim wątku wykazałem, że nawet w przypadku prostych zapytań select (prostych czyli bez złączeń tabel, bez grupowania, bez agregacji, bez offset, bez sortowania wielokolumnowego, bez LIKE, itd), transakcyjna baza danych sql jest około 100tys (słownie sto tysięcy) razy wolniejsza od programu napisanego w kompilowanych językach (np. C, C++, Java, Delphi, Assembler). Żeby nie było znowu wielkich nieporozumień, przypomnę co najistotniejsze, mianowicie test zakładał, iż dane są całkowicie zbuforowane w pamięci RAM.

Spowolnienie 100tys razy oznacza, że baza danych (dokładnie pisząc silnik bazy danych) wykonuje 100tys instrukcji procesora w jakimś innym celu po to, aby potem wykonać jedną instrukcję w celu właściwym, czyli w celu wyszukania właściwych danych. Jakby baza poświęcałą 300 instrukcji na inny cel, to może bym zrozumiał. Jednak 100tys nie mieści mi się w głowie.

Zastanawia mnie czego się spodziewać w przypadku baz NoSQL. W przypadku baz NoSQL rząd wielkości też będzie w okolicach 100tys, bo
baza 'musi jeszcze coś innego'?

Pozdrawiam

katelx
  • Rejestracja:prawie 10 lat
  • Ostatnio:4 miesiące
  • Lokalizacja:Hong Kong
11

jedyne co wykazales to ze nie masz za bardzo pojecia co robisz. masz jakas swoja hipoteze wynikajaca z ignorancji w temacie i stosujesz demagogie zeby ja przeforsowac.
wyobraz sobie alternatywna teorie - bazy danych zostaly stworzone po to zeby efektywnie przechowywac, zarzadzac i zwracac dane i (niepodzianka) dzialaja calkiem niezle na milion razy wiekszych zbiorach danych niz twoj. no ale jasne, bazy danych winne ze zamiast je jako tako ogarnac to ubolewasz ze w asemblesze to by szybciej bylo ;)

CeKa
Może brak klucza? :D
fasadin
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
  • Postów:4882
0

@artur_bredzki gdzie ten post gdzie to wykazales?

Bo jedynie co moge znalezc, to kod pisany w C z klasami (wiec ani to C ani to C++) i porownujesz baze danych do... tablic... co jest bardzo nietrafione

Patrzysz na efekt globalny a nie na techniczne detale i wyciagasz zle wnioski (odnosnie tego tematu Jak postgresql przechowuje tabele)

Moglbys mi podac linka gdzie przeprowadzales i wykazales ze sa wolniejsze? I to w tylu jezykach? a co z niekompilowalnymi jezykami? No i oczywiscie Ty piszesz ze pchasz wszystko do ramu. A jak to moge zapisac i pozniej odczytac? (zastanow sie nad ostatnim pytaniem, bo nie jest trywialne)

abrakadaber
abrakadaber
  • Rejestracja:ponad 12 lat
  • Ostatnio:7 miesięcy
  • Postów:6610
1

ja tylko przekopiuję tu odpowiedź jaśnie oświeconego na pytanie jak policzyć średnie w zadanym okresie czasu, uwaga

Policz średnie ruchome i uaktualniaj przyrostowo.

średnia roczna na dziś = ( średnia roczna na wczoraj * 365 + temperatura z dziś - temperatura sprzed roku ) / 365

jak widzicie wszystko staje się jasne - chcesz mieć szybką bazę danych - trzymaj wszystko w ramie (oczywiście wyniki wszelkich wcześniejszych zapytań też) i NIGDY nie wyłączaj komputera bo stracisz dane


Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.
KA
chcesz mieć szybką bazę danych - trzymaj wszystko w ramie ciekawe co na to @redis i @mongo
AB
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 8 lat
  • Postów:229
0
katelx napisał(a):

jedyne co wykazales to ze nie masz za bardzo pojecia co robisz.

Nie musisz sprowadzać rozmowy na poziom niżej.

katelx napisał(a):

masz jakas swoja hipoteze wynikajaca z ignorancji w temacie i stosujesz demagogie zeby ja przeforsowac.

Założe się o 1000zł że nie zrozumiałeś/aś mojej hipotezy.

katelx napisał(a):

wyobraz sobie alternatywna teorie - bazy danych zostaly stworzone po to zeby efektywnie przechowywac, zarzadzac i zwracac dane i

Proponuję na alternatywne teorie zalożyć osobny wątek, może być ciekawie.

katelx napisał(a):

(niepodzianka) dzialaja calkiem niezle na milion razy wiekszych zbiorach danych niz twoj. no ale jasne, bazy danych winne ze zamiast je jako tako ogarnac to ubolewasz ze w asemblesze to by szybciej bylo ;)

Niespodzianka zaszła jedynie w Twojej wyobraźni, ponieważ chesz przeforsować teorię, że mam strasznie złowrogie intencje wobec słodkich i kochaniutkich baz danych ;-)

Posłucha uważniej, ja rozmawiam rzeczowo, rzetelnie i o faktach. Faktami np. są:

  • te same wyniki uzyskane z zapytania sql co z programu napisanego w C++.
  • opis środowiska testowego, ten sam komputer, dane przechowywane w tym samym nośniku,
  • te same możliwości zaindeksowania danych,
  • znacząco różny czas wykonania obu prgramów, różnica rzędu 100tys razy.

Wniosek jest prosty, baza danych robi coś jeszcze. Zastanawia mnie po pierwsze co takiego baza jeszcze robi? Druga sprawa, czy w przypadku baz NoSQL można spodziewać się takiej samej katastrofy wydajnościowej?

Pozdrawiam

AB
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 8 lat
  • Postów:229
0
abrakadaber napisał(a):

ja tylko przekopiuję tu odpowiedź jaśnie oświeconego na pytanie jak policzyć średnie w zadanym okresie czasu, uwaga

Policz średnie ruchome i uaktualniaj przyrostowo.

średnia roczna na dziś = ( średnia roczna na wczoraj * 365 + temperatura z dziś - temperatura sprzed roku ) / 365

jak widzicie wszystko staje się jasne - chcesz mieć szybką bazę danych - trzymaj wszystko w ramie (oczywiście wyniki wszelkich wcześniejszych zapytań też) i NIGDY nie wyłączaj komputera bo stracisz dane

Gdzie Ty widzisz że użyłem słowa RAM w tej odpowiedzi? Masz urojenia czy co?

Zobacz pozostałe 7 komentarzy
AB
Pokazywałem, nie zrozumiałeś.
WL
No bo widzisz, ja taki głupi bez ł jestem i po prostu nie rozumiem. Zatem proszę ponownie, wyjaśnij tak żebym zrozumiał. Inni tez pewnie nie rozumieją, w końcu nie jestem taki ostatni ze swoją głupotą ;-) A całkowicie poważnie - chodzi o ten czy ni o ten przytoczony Twój post? I nie wykręcaj się sianem - tak czy nie? Jeśli jednak nie, to gdzie ten miarodajny test można zobaczyć?
AB
Widzisz, właśnie tego o co teraz Ty prosisz już kilka razy mi zabraklo w naszych rozmowach. Strzelam, oczywiście Ty żadnego podobieństwa nie zauważasz?
WL
W ogóle nie wiem do czego pijesz, ale do brzegu; a więc jednak odwracasz kota ogonem i żadnego miarodajnego testu opartego na faktach nie ma? Tak czy nie?
AB
To się nazywa lustro, odpowiadam Ci w taki sam sposób w jaki Ty mi, ale nie sądzę abyś się czegoś nauczył.
AB
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 8 lat
  • Postów:229
0
fasadin napisał(a):

@artur_bredzki gdzie ten post gdzie to wykazales?
Bo jedynie co moge znalezc, to kod pisany w C z klasami (wiec ani to C ani to C++)

To odszukałeś nie mój post, bo ja nie umiem programować w C z klasami, znam tylko C i C++.

fasadin napisał(a):

i porownujesz baze danych do... tablic... co jest bardzo nietrafione

Nie wiem czemu tak zrozumiałeś, przecież cały czas rozmowa byłą o zbuforowanej w pamięci RAM bazie danych. Bufor bazy danych porównuję do tablic, a nie bazę danych, co jest oczywiste.

fasadin napisał(a):

Patrzysz na efekt globalny a nie na techniczne detale i wyciagasz zle wnioski (odnosnie tego tematu Jak postgresql przechowuje tabele)

Co nazywasz detalami technicznymi i dlaczego powinienem zwracać uwagę na detale techniczne a nie na efekt globalny? Mojego klienta nie interesują detale techniczne, tylko właśnie efekt, czyli czas dostępu do danych, czas wyświetlenia rezultatu.

fasadin napisał(a):

Moglbys mi podac linka gdzie przeprowadzales i wykazales ze sa wolniejsze? I to w tylu jezykach?

Wydajność języków kompilowanych jest bardzo podobna, zależna od optymalizatora w kompilatorze tego języka. Jeśli w jednym kompilowanym języku uzyskuje się dany efekt, to w innych będzie bardzo podobny.

fasadin napisał(a):

a co z niekompilowalnymi jezykami?

Nie wiem, ale można się domyślać, że zależy wiele od tego, jak się użyje języków niekompilowanych. Zwykle języki interpretowane są wolniejsze 100 razy od kompilowanych, ale wiele zależy od sposobu w jaki się używa danego języka.

fasadin napisał(a):

No i oczywiscie Ty piszesz ze pchasz wszystko do ramu. A jak to moge zapisac i pozniej odczytac? (zastanow sie nad ostatnim pytaniem, bo nie jest trywialne)

To pytanie zadałeś, bo jak pisałem wyżej, nie zorzumiałeś o czym jest rozmowa. Nie chodzi o 'pchanie wszystkiego do ramu', tylko o pełne buforowanie danych dyskowych w pamięci RAM. Nie wiem dlaczego nie zrozumiałeś i TY i Twój przespiśca, ponieważ technki buforowania danych dyskowych w pamięci RAM są powszechne, buforują urządzenia, kontrolery, systemy plików, sterowniki, systemy operacyjne, bazy danych, a nawet aplikacje klienckie.

Pozdrawiam

katelx
  • Rejestracja:prawie 10 lat
  • Ostatnio:4 miesiące
  • Lokalizacja:Hong Kong
2

ok, widze ze cie najprawdopodobniej nie przekonam, no ale jeszcze raz zachecam do zapoznania sie z dowolna baza danych (dowolna popularna, ale polecam postgresa bo jest imo najfajniejszy). powtorze - to ze masz problemy wydajnosciowe to twoja wina.

AB
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 8 lat
  • Postów:229
0
katelx napisał(a):

ok, widze ze cie najprawdopodobniej nie przekonam, no ale jeszcze raz zachecam do zapoznania sie z dowolna baza danych (dowolna popularna, ale polecam postgresa bo jest imo najfajniejszy). powtorze - to ze masz problemy wydajnosciowe to twoja wina.

Przecież tutaj nie chodzi o przekonywanie ani o czyjąś winę. Co do czego w tym wątku chcesz mnie przekonywać? Chcesz mnie przekonać że minuta to jest sekunda? Czy to moja wina że mój zegarek chodzi tak samo jak Twój?

Powtórzę, nie chodzi o moje problemy z wydajnością bazy. Chodzi o rzetelny i obiektywny pomiar czasu wykonania dwóch programów. Jeden z tych programów wykonuje się koszmarnie wolno, tak się składa że koszmarnie wolno wykonuje się zapytanei SQL. Chcę wiedzieć dlaczego wykonuje się koszmarnie wolno i chcę wiedzieć czy podobnie jest w przypadku baz NoSQL. Po to są obiektywne metody porównywania, żeby nikt do niczego nie musiał nikogo przekonywać.

Mogę nawet napisać Ci dlaczego chcę to wiedzieć. Bo zamierzam napisać specjalistyczną bazę danych do jednej aplikacji w C++. Zastanawiam się czy moja baza nie będzie musiała robić tego wszystkiego co robi baza SQL i czy w efekcie nie zadziała też koszmarnie wolno. Rozumiesz już cokolwiek z mojej wypowiedzi, czy nadal wolisz sprowadzać rozmowę na tor w stylu 'jaki z ciebie ignorant/debil, nie rozumiesz do czego są bazy danych'? Jeśli rozumiesz i masz do powiedzenia coś rzeczowego/obiektywnego w temacie, to zachęcam do dalszej rozmowy, a w przeciwnym razie proponuję osobny wątek.

Pozdrawiam

edytowany 1x, ostatnio: artur_bredzki
Zobacz pozostałe 4 komentarze
HI
Zaskoczę Cię: forum jest po to, żeby wyrażać swoją opinię. Co do krytykujących: przynajmniej potrafią to zrobić w normalny sposób a nie jak "gimbus" (gdybyś nie zrozumiał: mam na myśli Twój komentarz).
RA
Twoj komentarz nie rozni sie niczym od tych pod filmami na yt: 'super', 'jestem pierwszy', 'co to za gniot' - tyle samo w nich merytorycznych tresci. Artur pyta o konkrety i twoja bezwartosciowa opinia jest dla niego zbedna.
RA
PS. to forum jest po to zeby rozwiazywac i pomagac gdy ktos ma jakis problem ;)
HI
Kolejna niespodzianka: komentarze na 4p służą do wtrącania jakichś nie związanych do końca z tematem uwag. Gdybym miał coś konkretnego do napisania dodał bym post. Mam wrażenie, że należysz do osobników którzy "mają rację", dlatego w tym miejscu pozwolę sobie urwać dyskusję.
axelbest
Ja uważam że komentarze "super" oraz "co to za gniot" na YT są bardzo pomocne. Każdy ma prawo wyrazić swoją opinię, a tego typu komenty dają jasne info dla autora. A co do "pierwszy" - albo Cię to bawi albo nie. Mnie np bawi, tak samo jak "auuu.... nie w szczepionkę"
axelbest
  • Rejestracja:ponad 17 lat
  • Ostatnio:około 3 godziny
  • Lokalizacja:Warszawa
  • Postów:2251
2

Spowolnienie 100tys razy oznacza, że baza danych (dokładnie pisząc silnik bazy danych) wykonuje 100tys instrukcji procesora w jakimś innym celu po to, aby potem wykonać jedną instrukcję w celu właściwym, czyli w celu wyszukania właściwych danych.

WTF? Idąc tym tokiem rozumowania skoro moja strona www ładuje się w 600ms, a google w 300ms - to znaczy że kod google'a jest dwa razy mniej skompilowany? czy może serwery google wykonują mniej 2x mniej instrukcji niż u mnie? A może google ma tylko 2x mocniejszy serwer niż mój?

edytowany 2x, ostatnio: axelbest
WL
Nie, nie - jesteś 2x głupszy od google :D Ale nie przejmuj się, ja jestem o rząd wielkości głupszy od autora miarodajnych testów ;-)
axelbest
Hehe... jak jestem 2x glupszy niz google to jeszcze nie tak źle. :D
abrakadaber
abrakadaber
  • Rejestracja:ponad 12 lat
  • Ostatnio:7 miesięcy
  • Postów:6610
1
  1. bazy danych SQL (mam na myśli program, nie konkretne schematy bazy) są projektowane i pisane tak, aby pokryć jak największą ilość przypadków - są uniwersalne
  2. bazy danych SQL muszą zapewnić po pierwsze bezpieczeństwo danych (w tym fakt, że po wyłączeniu zasilania dane nie zginą) a po drugie WIELODOSTĘP
  3. system napisany pod specjalne wytyczne (o ile jest napisany poprawnie) zawsze będzie szybszy od systemu ogólnego

Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.
AB
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 8 lat
  • Postów:229
0
axelbest napisał(a):

Spowolnienie 100tys razy oznacza, że baza danych (dokładnie pisząc silnik bazy danych) wykonuje 100tys instrukcji procesora w jakimś innym celu po to, aby potem wykonać jedną instrukcję w celu właściwym, czyli w celu wyszukania właściwych danych.

WTF? Idąc tym tokiem rozumowania skoro moja strona www ładuje się w 600ms, a google w 300ms - to znaczy że kod google'a jest dwa razy mniej skompilowany? czy może serwery google wykonują mniej 2x mniej instrukcji niż u mnie? A może google ma tylko 2x mocniejszy serwer niż mój?

Dlaczego pytasz?

axelbest
  • Rejestracja:ponad 17 lat
  • Ostatnio:około 3 godziny
  • Lokalizacja:Warszawa
  • Postów:2251
0

Jestem ciekaw jak policzyłeś fakt że jeśli jakiś proces wykonuje się 100 tys. razy wolniej niż drugi - to że ten pierwszy wykonuje dokładnie tyle samo nadmiarowych instrukcji? Nie mam takiej wiedzy jak Ty, na codzień programuje w języku programowania dla leszczy (żadne tam C/Java) więc po prostu chce się dokształcić, bo jak to mawiają - mądrego zawsze warto posłuchać.

mr_jaro
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Grudziądz/Bydgoszcz
  • Postów:5300
1

Przypomniało mi się jak na prywatnym portalu nie nadałem indexów na pewnych tabelkach. W pewnym momencie strona generowała się 10s, a ja zwalałem winę na hosting. W końcu sprawdziłem czasy zapytań a tam jedno z zapytań 5s xd nadałem indexy tam gdzie nie nadałem i nagle wszystko zaczęło śmigać. A zapytanie najcięższe z 5s spadło do 200ms :D


It's All About the Game.
katelx
  • Rejestracja:prawie 10 lat
  • Ostatnio:4 miesiące
  • Lokalizacja:Hong Kong
3
artur_bredzki napisał(a):

Bo zamierzam napisać specjalistyczną bazę danych do jednej aplikacji w C++
nie no to szacun ze masz wystarczajaca wiedze na napisanie lepszej bazy danych niz te opracowane przez specjalistow w tej dziedzinie i przetestowane przez miliony wdrozen. klient na pewno bedzie zadowolony z oszczednosci jakie poczynil wybierajac wlasnie twoje rozwiazanie

artur_bredzki napisał(a):

Zastanawiam się czy moja baza nie będzie musiała robić tego wszystkiego co robi baza SQL i czy w efekcie nie zadziała też koszmarnie wolno
ano tak, nie znasz podstaw dzialania baz danych wiec stwierdzasz ze napiszesz swoja, jednym slowem pro

artur_bredzki napisał(a):

Rozumiesz już cokolwiek z mojej wypowiedzi, czy nadal wolisz sprowadzać rozmowę na tor w stylu 'jaki z ciebie ignorant/debil, nie rozumiesz do czego są bazy danych'?
ale ja nie chce cie obrazac, po prostu cos tam wiem o bazach danych i mozna powiedziec ze na codzien zajmuje sie pisaniem wlasnych struktur danych do przetwarzania duzych ilosci danych w czasie rzeczywistym. dlatego traktuj to jako przyjacielska rade - wez sobie postaw postgresa na wirtualce, znajdz fajny tutorial i pobaw sie troche danymi zamiast robic bezsensowne porownania miedzy hello world w c++ a profesjonalnym rozwiazaniem bo to naprawde nie ma sensu.

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
1

@artur_bredzki linkowałem ci w ostatnim tematcie bardzo porządną ksiażkę. Ściągnij ja / wypożycz z biblioteki i przeczytaj ze zrozumieniem. Ja wiem ze długa, ale doświadczenie uczy że da się ją przeczytać w 2 dni przed egzaminem, więc w normalnych warunkach starczy ci tydzień. Dopiero jak przeczytasz ją ze zrozumieniem wróć tutaj i możemy o czymś dyskutować.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
AB
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 8 lat
  • Postów:229
0
abrakadaber napisał(a):
  1. bazy danych SQL (mam na myśli program, nie konkretne schematy bazy) są projektowane i pisane tak, aby pokryć jak największą ilość przypadków - są uniwersalne
  2. bazy danych SQL muszą zapewnić po pierwsze bezpieczeństwo danych (w tym fakt, że po wyłączeniu zasilania dane nie zginą) a po drugie WIELODOSTĘP
  3. system napisany pod specjalne wytyczne (o ile jest napisany poprawnie) zawsze będzie szybszy od systemu ogólnego

Oooo! W końcu widzę i odpowiedź którą nazwałbym 'światełko w tunelu' :)

To wszystko co napisałeś jest prawdą, jest wręcz oczywiste i odzwierciedla przyczynę spowolnienia które mnie niepokoi.

Oczywiście baza danych (rozumiana jako silnik) musi wykonać więcej niż program operujący na tablicy ram.

Mimo wszystko niepokoi mnie rząd wielkości jaki zaobserwowałem, różnicy czasu rzędu 100tys raz nie spodziewałbym się w
najgorszych koszmarach. Myślałem że narzut bazy będzie od 100 do 1000 razy, ale 100tys?

Co baza danych musi zrobić z zapytaniem?

  1. Najpierw połączenie przez np. TCP/IP.
  2. Potem parsowanie zapytania.
  3. Dalej, optymalizacja zapytania.
  4. Potem, (chyba) zamiana zapytania na wewnętrzny kod.
  5. Dalej (być może) kompilacja wewnętrznego kodu.
  6. W końcu wykonanie zapytania.
  7. Odesłanie wyników.

Oczywistym jest, że wraz z rozrostem danych coraz bardziej istotny wpływ na czas wykonania ma punkt 6, więc pozostałe punkty bym pominął.
Szczególnie w prostych zapytaniach punkt 6 ma decydujący wpływ.

Więc co taka lub inna baza danych musi zrobić w punkcie szóstym, czego nie robi program operujący na tablicy w RAM?

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

I/O jest tysiace razy wolniejsze niż dostęp do CPU cache (a to w twoim programie robiłeś, nie było tam nigdzie czytania z RAMu).
Czytanie danych z dysku to jest bardzo wolne I/O, a jeśli jeszcze baza uzna że najlepiej zrobić skanowanie według indeksu secondary i wykona wiele dostępów do dysku to juz w ogóle mogiła.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
AB
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 8 lat
  • Postów:229
0
mr_jaro napisał(a):

Przypomniało mi się jak na prywatnym portalu nie nadałem indexów na pewnych tabelkach. W pewnym momencie strona generowała się 10s, a ja zwalałem winę na hosting. W końcu sprawdziłem czasy zapytań a tam jedno z zapytań 5s xd nadałem indexy tam gdzie nie nadałem i nagle wszystko zaczęło śmigać. A zapytanie najcięższe z 5s spadło do 200ms :D

Wiadomo, indeksy to podstawa optymalizacji. Myślę że najważniejsza sprawa w optymalizacji baz danych to odpowiednia struktura, w tym wyniki częściowe. Druga co do ważności to odpowiedni sprzęt i bufor RAM. Czasy dostępu na dyskach talerzowych, dyskach SSD i w pamięci RAM
różnią się kolosalnie. Trzecia co do ważności to pewnie indeksy. To wszystko przerobiłem i okazało się, że nie wystarcza. Na niektórych zapytaniach baza zamula i daje odpoweidź aż po 40s. Więc myślę, że teraz przyszedł czas na optymalizację samego wykonania zapytania, niestety tego już w SQLu nie da się zrobić.

Pozdrawiam

axelbest napisał(a):

Jestem ciekaw jak policzyłeś fakt że jeśli jakiś proces wykonuje się 100 tys. razy wolniej niż drugi - to że ten pierwszy wykonuje dokładnie tyle samo nadmiarowych instrukcji? Nie mam takiej wiedzy jak Ty, na codzień programuje w języku programowania dla leszczy (żadne tam C/Java) więc po prostu chce się dokształcić, bo jak to mawiają - mądrego zawsze warto posłuchać.

Nie zrobiłem w tej kwestii nic bardziej rewelacyjnego niż mógłby zrobić każdy. Podzielilem jeden czas przez drugi. Wyszło 1000 razy.
Program w C++ był metodą fullscan, a SQL z indeksami. Więc zastanowiłem się co się stanie gdy w C++ też użyję indeksów. Wyszło mi że
program przerzuci 1000razy mniej danych, ale dostęp do danych (nie-sekwencyjny) wydłuży się 10 razy, czyli 1000*1000/10 = 100tys razy.

axelbest
Nadal nie odpowiedziałeś na moje pytanie jak wyliczyłeś tą ilość instrukcji procesora cyt. "Spowolnienie 100tys razy oznacza, że baza danych (dokładnie pisząc silnik bazy danych) wykonuje 100tys instrukcji procesora" Skąd żeś wziął te 100 tys. instrukcji procesora?
AB
Oszacowałem tę ilość instrukcji z czasu wykonania zapytania. Na potrzeby tej rozmowy takie oszacowanie jest wystarczające, oczywiście w praktyce może być inaczej, silnik może w ogóle nie wykonywać instrukcji, tylko może np. wisieć na IO, na semaforze, itd.
katelx
  • Rejestracja:prawie 10 lat
  • Ostatnio:4 miesiące
  • Lokalizacja:Hong Kong
0

zeby nie bylo ze tylko dokuczam, masz tu rozwiazanie nosql ktore smialo moglabym polecic najbardziej wymagajacym maniakom czystej wydajnosci - kdb+

mr_jaro
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Grudziądz/Bydgoszcz
  • Postów:5300
0
artur_bredzki napisał(a):

Na niektórych zapytaniach baza zamula i daje odpoweidź aż po 40s. Więc myślę, że teraz przyszedł czas na optymalizację samego wykonania zapytania, niestety tego już w SQLu nie da się zrobić.

Podziel zapytanie. Jeżeli jedno duże wykonuje się zbyt długo to w 99% przypadkach u mnie podział na kilka mniejszych zapytań nawet wywoływanych w pętli dał wynik mnie satysfakcjonujący.


It's All About the Game.
AB
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 8 lat
  • Postów:229
0
katelx napisał(a):
artur_bredzki napisał(a):

Bo zamierzam napisać specjalistyczną bazę danych do jednej aplikacji w C++
nie no to szacun ze masz wystarczajaca wiedze na napisanie lepszej bazy danych niz te opracowane przez specjalistow w tej dziedzinie i przetestowane przez miliony wdrozen. klient na pewno bedzie zadowolony z oszczednosci jakie poczynil wybierajac wlasnie twoje rozwiazanie

Nadal nic nie rozumiesz, albo celowo wypaczasz moją wypowiedź. Pisałem 'specjalistyczną bazę do jednej aplikacji', a nie bazę ogolną. Czy wiesz jaka jest różnica pomiędzy specjalistyczną bazą a ogólną? Za szacunek dziękuję, mam więdzę aby napisać niektóre specjalistyczne bazy danych do aplikacji.

artur_bredzki napisał(a):

Zastanawiam się czy moja baza nie będzie musiała robić tego wszystkiego co robi baza SQL i czy w efekcie nie zadziała też koszmarnie wolno
ano tak, nie znasz podstaw dzialania baz danych wiec stwierdzasz ze napiszesz swoja,
</quote>
Nie lubię ogólnej krytyki, bo nie mogę się z tego nic nauczyć. Czy możesz napisać konkretnie JAKICH podstaw nie znam?

artur_bredzki napisał(a):

jednym slowem pro

Jednym słowem, ja o niebie, a Ty o chlebie, ale nie musisz zrozumieć wypowiedzi, aby krytykować.

artur_bredzki napisał(a):

Rozumiesz już cokolwiek z mojej wypowiedzi, czy nadal wolisz sprowadzać rozmowę na tor w stylu 'jaki z ciebie ignorant/debil, nie rozumiesz do czego są bazy danych'?

artur_bredzki napisał(a):

ale ja nie chce cie obrazac, po prostu cos tam wiem o bazach danych i mozna powiedziec ze na codzien zajmuje sie pisaniem wlasnych struktur danych do przetwarzania duzych ilosci danych w czasie rzeczywistym. dlatego traktuj to jako przyjacielska rade - wez sobie postaw postgresa na wirtualce, znajdz fajny tutorial i pobaw sie troche danymi zamiast robic bezsensowne porownania miedzy hello world w c++ a profesjonalnym rozwiazaniem bo to naprawde nie ma sensu.

Wcale a wcale nie krytykujesz, nic nie obrażasz, rozmowa z Tobą jest na wysokim poziomie, a program który wypluwa te same dane co zapytanie SQL nazywasz hello world....

Jeśli nie obrażasz celowo, to może Ty czegoś nie rozumiesz? Może znasz się na bazach, a nie znasz się na bebechach procesora i nie dociera do Ciebie porównanie programu w C++ do zapytania SQL?

AB
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 8 lat
  • Postów:229
0
mr_jaro napisał(a):
artur_bredzki napisał(a):

Na niektórych zapytaniach baza zamula i daje odpoweidź aż po 40s. Więc myślę, że teraz przyszedł czas na optymalizację samego wykonania zapytania, niestety tego już w SQLu nie da się zrobić.

Podziel zapytanie. Jeżeli jedno duże wykonuje się zbyt długo to w 99% przypadkach u mnie podział na kilka mniejszych zapytań nawet wywoływanych w pętli dał wynik mnie satysfakcjonujący.

Tak, jest to dobra technika optymalizacyjna. W moim przypadku akurat bym musiał zainstalować kilka baz (tak żeby pracowały na niezależnym procesorze i ram), potem podzielić dane pomiędzy bazy, ostatecznie w programie złączać wyniki. Jakiś czas temu nawet wypromowano tej technice optymalizacyjnej marketingową nazwę map-reduce. Niby taki hadoop ma tę technikę natywnie, ale nie wiem jaka jest wydajność przykładowego hadoopa na pojedynczej maszynie. Myślę, że to co można zrealizować na postgresie na 10-300 maszynach, w niektórych przypadkach można w C++ na jednej maszynie. Bym musiał analogiczny eksperyment przeprowadzić na hadoopie.

mr_jaro
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Grudziądz/Bydgoszcz
  • Postów:5300
1

Jak napiszesz swoją bazę i będzie ci wszystko działać to wróć się pochwal :) Ja też kiedyś napisałem framework php bo uważałem, że to co jest na rynku jest zbyt wolne :) Nawet działał na 3 stronach także ten... :p


It's All About the Game.
AB
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 8 lat
  • Postów:229
0
mr_jaro napisał(a):

Jak napiszesz swoją bazę i będzie ci wszystko działać to wróć się pochwal :) Ja też kiedyś napisałem framework php bo uważałem, że to co jest na rynku jest zbyt wolne :) Nawet działał na 3 stronach także ten... :p

Co tu się chwalić. Kilka swoich specjalistycznych baz pod daną aplikację napisałem, spełniały swoje zadanie bardzo dobrze. Problem jest czas niezbędny na pracę i ryzyko, że się wszystkiego nie uwzględni i potem własna baza będzie działała gorzej niż dostępne za darmo i od razu.

katelx
  • Rejestracja:prawie 10 lat
  • Ostatnio:4 miesiące
  • Lokalizacja:Hong Kong
0
artur_bredzki napisał(a):

Jeśli nie obrażasz celowo, to może Ty czegoś nie rozumiesz? Może znasz się na bazach, a nie znasz się na bebechach procesora i nie dociera do Ciebie porównanie programu w C++ do zapytania SQL?
no tak srednio trafiles. wlasnie sporo pracuje nad optymalizacja kodu pod cache procesora. nie dociera do mnie porownanie bo jest ono najogolniej mowiac z d**y. ale wierz tam sobie nawet we wrozbite macieja.
dalam ci wyzej linka do bardzo dobrego (jesli nie najlepszego), komercyjnie wspieranego (a 32bitowa baza za free) rozwiazania na problemy ktore posiadasz (minimalistyczny jezyk/interpreter pozwala na upakowanie calej appki w L1 cache!) wypadaloby zebys chociaz podziekowal i powiedzial czy jest to wystarczajace na twoje potrzeby.

AB
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 8 lat
  • Postów:229
0
katelx napisał(a):
artur_bredzki napisał(a):

Jeśli nie obrażasz celowo, to może Ty czegoś nie rozumiesz? Może znasz się na bazach, a nie znasz się na bebechach procesora i nie dociera do Ciebie porównanie programu w C++ do zapytania SQL?

no tak srednio trafiles. wlasnie sporo pracuje nad optymalizacja kodu pod cache procesora. nie dociera do mnie porownanie bo jest ono najogolniej mowiac z d**y.

Dla mnie z d**y jest odpowiedź która zaiwera uzasadnienie że że coś jest z d**y.

katelx napisał(a):

ale wierz tam sobie nawet we wrozbite macieja.

Ja wierzę tylko w pomiar czasu. Jeśli coś działa w krótszym czasie i daje ten sam efekt, to nie jest z d**y.

katelx napisał(a):

dalam ci wyzej linka do bardzo dobrego (jesli nie najlepszego), komercyjnie wspieranego (a 32bitowa baza za free) rozwiazania na problemy ktore posiadasz (minimalistyczny jezyk/interpreter pozwala na upakowanie calej appki w L1 cache!) wypadaloby zebys chociaz podziekowal i powiedzial czy jest to wystarczajace na twoje potrzeby.

Dziękuję. Czy jest na moje potrzeby? Trudno będzie odpowiedzieć, to pewnie wymaga nie tylko analizy, ale i testów. Kiedyś naczytałem się o rzekomej wydajności baz danych SQL i też myślałem że będą idealne na moje potrzebny, indeksy, optymalizatory, cuda... a tu wyszło że są, że znowu posłużę się Twoim porównaniem, z d**y.

edytowany 1x, ostatnio: artur_bredzki
AB
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 8 lat
  • Postów:229
0
Shalom napisał(a):

I/O jest tysiace razy wolniejsze niż dostęp do CPU cache (a to w twoim programie robiłeś, nie było tam nigdzie czytania z RAMu).
Czytanie danych z dysku to jest bardzo wolne I/O, a jeśli jeszcze baza uzna że najlepiej zrobić skanowanie według indeksu secondary i wykona wiele dostępów do dysku to juz w ogóle mogiła.

Oczywiście, to wszystko prawda. Dostęp do danych na dysku jest bardzo wolny. Odczyt danych z dysku zazwyczaj też szybki nie jest. Dlatego oczywiście zadbałem w testach o to, aby dane i indeksy bazy SQL był w buforze RAM.

Pipes
Offtop: Ten wątek rozbawił mnie do łez :)
AB
Strasznie dużo nieporozumień, co może być nawet śmieszne, ale po co wyzywać od debili bez zrozumienia, to ani nie ogarniam, ani mnie nie śmieszy.
0

Widzę, że jest zajadła dyskusja, więc próbowałem się dowiedzieć z Jak postgresql przechowuje tabele, o czym, ale może za wcześnie odpadłem. Wygląda, że porównujesz zapytanie SQL z programem w C++, który jednak robi coś prostszego, bo nie ma sortowania. Chyba można przyjąć, że najlepszy czas wykonania SQL jest wtedy, gdy dane rzeczywiście są zbuforowane w RAM, a wtedy jest tylko o rząd wielkości wolniej niż w przypadku programu w C++. Poza tym nie wiadomo, jakie są rozkłady wartości w tabeli i czy są policzone statystyki. Od tego może mocno zależeć, czy użycie indeksów jest sensowne.

Czy coś pominąłem?

0

@artur_bredzki Na moje to za dużo biadolisz, napisz coś i zaprezentuj na forum to pogadamy

AB
Ok, ale pod pewnym warunkiem. Ty zrobisz drugie (jakieś inne zapytanie niż moje) w SQLITE i C++. W ten sposób będą na forum dwa eksperymenty, po co polegać na jednym? Zapytanie w C++ musi być na full zoptymalizowane, ma używać wszędzie hash-tablic i drzew wyszukiwań, dane muszą być zbuforowane w ram (żadna tabela w ram). Umowa stoi?
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)