LightDB to nowy, polski projekt otwartego serwera bazy danych, podobnego strukturą do MySQL
Polscy programiści przygotowują właśnie nowy projekt bazy danych opartej o SQLite. Ma działać na systemach Microsoft Windows oraz Linux, wspierać kryptografie połączeń RSA oraz zapytania SQL. Dostęp do bazy zapewnia wydane niedawno rozszerzenie do języka PHP o nazwie php_lightdb. Obsługa bazy z poziomu skryptów jest równie prosta jak obsługa MySQL.
Serwer uruchamia w systemie demona który czeka na połączenia od klientów i interpretuje ich zapytania, przekazując je do bazy. Możliwe jest oczywiście zamontowanie na serwerze wielu baz oraz wielu użytkowników z różnymi uprawnieniami (podobnie jak w MySQL). Obecnie dostępna jest wersja BETA 0.1
Strona projektu: http://lightdb.sourceforge.net
Jeśli uważasz, że ten nius jest nieobiektywny, przedstawia nieprawdziwe wydarzenie, jest spamem lub nie spełnia standardów serwisu,
napisz raport.
Komentarze (RSS)
Komentarze są prywatnymi opiniami dodających je osób. Prosimy o zachowanie kultury wypowiedzi. Komentarze obraźliwe oraz obniżające poziom serwisu będą usuwane. Więcej w
regulaminie komentowania.
W komentarzach możesz używać prostych znaczników HTML. Przykłady:
- Link: <a href="jaklinux.org">Linux dla każdego</a>,
- Wytłuszczenie: <strong>tekst pogrubiony</strong>,
- Kursywa: <em>tekst pochylony</em>,
- Przekreślenie: <strike>
tekst przekreślony</strike>,
- Kod: <code>
printf("blok kodu");</code>,
- Cytat: <blockquote>cytat</blockquote>
Uwaga: jeśli dodasz nieznany znacznik, będzie on niewidoczny, gdyż system filtruje takie znaczniki.

Wszystkie autorskie niusy w serwisie publikowane są na licencji Creative Commons Uznanie autorstwa 2.5 Polska. Uwaga, jeśli nius jest skopiowany z innej strony, kopiując go należy podać link również do tej strony!
Heh, dosłownie przed chwilą wysłuchałem podcasta z udziałem Richarda Hippa dotyczącego SQLite.
Prawdo mówiąc nie rozumiem jaki cel stawia sobie ten projekt, może ktoś mnie oświeci?
Obsługa SQLite jest standardowo dostępna w PHP5, nie potrzeba do tego żadnych zewnętrznych aplikacji. Porównanie z MySQL też nie na miejscu. Skoro projekt bazuje na SQLite to zapewne skaluje się równie kiepsko jak pierwowzór. SQLite świetnie sprawdza się w rozwiązaniach wbudowanych.
Więcej pisać mi się nie chce, bo nie mam pojęcia o LightDB. Jeden z powodów do uszkodzony plik z źródłami, który można pobrać ze strony projektu.
Dla wiedzy? Ja zabieram się za mnóstwo różnych rzeczy, tylko po to żeby się czegoś nauczyć / zrozumieć jak coś działa.
nie wiem, czy SQLite jest taki dobry jako wbudowany “serwer” SQL. Z własnego doświadczenia wiem, jak bardzo jest uciążliwy – potrafi zablokować całą aplikację ( co ciekawe – mimo wyrzucenia do osobnego wątku) na czas grzebania w bazie danych. MySQL Embedded nie ma takich wad, ale – niestety – obciąża aplikację ośmiomegabajtowym balastem. Jednak coś za coś – możliwość użycia bardziej zaawansowanego SQLa się przydaje.
No jeśli Ci się wątki wieszają, to albo masz coś nie tak z jajkiem (najmniej prawdopodobne) albo jeden czeka na drugi, ew. coś się kleszczy – w obydwu przypadkach błąd po stronie implementacji Twojego programu.
niekoniecznie. SQLite operuje na danych dyskowych i nie zawsze daje się zmusić do trzymania bufora w pamięci. Jeżeli masz powolny dysk flash, to wątki zostaną zablokowane oczekiwaniem na wejście/wyjście. Jeżeli zwykła zmiana bazy znacznie zwiększyła responsywność aplikacji, to mówi samo za siebie.
http://www.sqlite.org/inmemorydb.html
tia…
czy ja gdzieś twierdziłem, że nie da się stworzyć bazy SQLite w pamięci operacyjnej? to, co napisałem, a to, co Ty znalazłeś w dokumentacji, to zupełnie różne rzeczy
To na pewno miłe jest mieć wybór ale wydaje mi się, że relacyjne bazy danych idą w przeszłość (aczkolwiek bardzo powoli). Według mnie w przyszłości coraz częściej będzie się zdarzała sytuacja, że jakaś baza danych będzie obciążona tysiącami “ciężkich” klientów jednocześnie. W takiej sytuacji lepiej sprawdzają się nierelacyjne DB. Odpadają wtedy kłopoty z partycjonowaniem zasobów. Skalę problemów do rozwiązania w wielkich relacyjnych DB widać wyraźnie w cenach licencji na takie bazy danych, np. Oracle.
Zadnym specem od baz nie jestem, ale to marudzenie o relacyjnych
bazach danych do zludzenia przypomina mi marudzenie o monolitycznych
kernelach ktore podobno odeszly do lamusa juz w latach 80-tych…
A w dodatku nic lepszego nie ma !!
Jak zawsze w takim wypadku zależy od zastosowań. Jednak zauważam że coraz częściej mówi się ostatnio o innych projektach jak choćby Cassandra.
@przemo_li – Tak jak Sit powiedział, wszystko zależy od zastosowań. Nie ma czegoś takiego jak jedno narzędzie do wszystkiego. Przykładowo, jeśli dane się zmieniają często, ale zapytania są stałe, to wtedy najlepsze są właśnie nierelacyjne DB. Przykładem istniejącym jest tu naliczanie billingów ze strony operatorów sieci komórkowych dla milionów klientów. Tak jak kiedyś słyszałem, tam w ogóle nie stosuje się relacyjnych DB bo szkoda marnować zasoby serwera na obsługę warstwy abstrakcji zwanej modelem relacyjnym. Zastosuj tam takiego Oracle to wtedy byś zobaczył ile razy trzeba zwiększyć liczbę serwerów DB
Sęk w tym, że telekomy używają do tego właśnie relacyjnych baz danych. Np. Polkomtel jedzie na Oracle i Teradata.
Nie widzę też niby gdzie model relacyjny “marnuje zasoby na dodatkową warstwę abstrakcji”. Masz na myśli czas potrzebny na kompilację i optymalizację zapytań? Tj. milisekundy w stosunku do godzin na policzenie billingu?
A co do modnych ostatnio baz nierelacyjnych: nie ma to jak uniknięcie problemu skalowalności powiązanych ze sobą transakcyjnych danych poprzez… zabronienie wiązania ze sobą danych i brak transakcyjności.
@abcman
Najlepszość niejedno ma imię. Telekomy jadą akurat właśnie na Oracle’u
Tak, również w systemach “onlajn-czardżing” 

I w tych zastosowaniach, cena sprzętu jest naprawdę drugorzędna
A oracle jest dlatego, że vendor może sobie przykleić znaną metkę
i akurat dane billingowe są b. dobrze ustrukturyzowane.
@Królik, Budyń – Czytałem w jakimś numerze SDJ że telekomy często używają nierelacyjnych baz danych w niektórych zastosowaniach. To co więc mówiłem, nie jest oparta na moim widzimisię.
@Królik – Nie widzisz? To zobacz różnicę w efektywności relacyjnych i nierelacyjnych baz danych dla wielkich prędkości przetwarzania. Rekordy w takich prędkościach należą do tych drugich właśnie.
Brak transakcyjności to wada? Owszem, ale w relacyjnych DB. Po co Ci transakcje w nierelacyjnych DB? Żeby więcej pieniędzy na większy serwer wydać? Bo jeśli chodzi o spójność danych, to wszystko jest w tych nierel. w porządku.
“o zobacz różnicę w efektywności relacyjnych i nierelacyjnych baz danych dla wielkich prędkości przetwarzania.”
To ja poproszę linka do tych rekordów
Ale nie że ktoś sobie coś w domu zmierzył i opisał na blogu, tylko do recenzowanego artykułu.
“Brak transakcyjności to wada? Owszem, ale w relacyjnych DB”
Co ma piernik do wiatraka? Od kiedy używanie nierelacyjnej bazy gwarantuje, że sprzęt pod nią się nie sypnie? Albo że dwóch na raz będzie chciało czytać / pisać te same dane?
Hmm. Z tego co wiem problemem nierelacyjnych baz danych jest brak odpowiednio rozpracowanego kwasu[1] (ACID
).
“Po co Ci transakcje w nierelacyjnych DB?”
Hmm. Z tych samych powodów co potrzebuje ‘tranzakcji’ w programowaniu za pomocą semaforów/algorytmów lock-free?
[1] K – ???
W – wieczność (durability
A – atomiczność
S – spójność
K – jak isolation: kapsułkowanie
poeta ze mnie marny, ale starałem się
“Hmm. Z tych samych powodów co potrzebuje ‘tranzakcji’ w programowaniu za pomocą semaforów/algorytmów lock-free”
Tyle że programowanie przy użyciu semaforów i alg. lock-free to wyższa szkoła jazdy (i niższy poziom abstrakcji). Raczej wszystko idzie w kierunku zastąpienia tego modelu programowania innymi (CSP, STM), niż przenoszeniu go na grunt baz danych.
@Królik, @Budyn – prosze, oto link do artykulu: http://www.allthingsdistributed.com/2008/12/eventually_consistent.html
Ludzie podniecają się tym NoSQL tylko że problem jest zupełnie gdzie indziej. Bazy relacyjne są bazami uniwersalnymi (aby cos uniwersalnego działało optymalnie musi by skonfigurowane), bazy danych nierelacyjne są bazami specjalizowanymi do danego zastosowania (mniej konfigurowania, kosztem elastyczności).
. Większośc uzywa ORM’ów(wbijcie sobie do głowy że to się nie nadaje do skomplikowanych zapytań, ba robi problemy przy prostych zapytaniach) i mitów typu (join jest szybszy od IN) mimo że jest to zależne od ilości wartości w złączeniu.
System oparty o bazę relacyjną może śmigac ale do optymalnego działania potrzebni są ludzie którzy wiedzą że:
- bazy danych nie można traktowac jako black box
- właściwy model to 60% sukcesu ( modelowanie struktur to najważniejszy etap tworzeni aplikacji/systemu, trzeba wiedziec kiedy mozna rozszerzyc tabele a kiedy wskazane jest rozbicie na kilka tabel)
- NULL jest wbrew pozorom bardzo kosztowny
- trzymanie blobów/plików w bazie danych to generalnie zły pomysł(tak naprawdę koncepcja “worka na dane” to w bazach relacyjnych totalna porażka)
Dodatkowo mało osób “orientuje” się w relacyjnych bazach danych. Nikt nie uczy teorii baz danych, więc większośc nie ma pojęcia jak to naprawdę działa. A nawet jak się ktoś uczył nie znaczy że to rozumie
Moj kierownik był bardzo zdziwiony gdy mu udowodniłem że typ danych ‘ala prefix’ (mimo że same cyfry ) był bardziej wydajny na typie tekstowym, pózniej probował na sile wrzucac analogie do innych intow, wiec musiałem przedstawic budowe indeksu btree ze wzgledu na typ danych.
@abcman akurat tego testu nie widziałem.
Ale bardzo duzo daje do myslenia test nosql sprzed pół roku po miesiącu ukazał sie ten sam test pod realcyjną bazą gdzie osiagnięto podobne wyniki. Jedyny speed nierelacyjnych był na załadowaniu klastra. Morał da się .
Telekomy i nierelacyjne bazy? Też mi “ciekawostka”…
TP SA i PTK Centertel (Orange) używają prawie wyłącznie Oracle DB (sporadycznie PostgreSQL, MS SQL Server, DB2). Dla Data Mining / OLAP używa się Teradata lub nakładkę nad Oracle: Business Objects.
Z tego co pamiętam ERA GSM i Netia też jadą na Oracle DB.
W Orange nawet dispatcher SMS działa na Oracle DB.
Ja tego nie czytałem, ja to wiem, bo przy tym pracowałem.
Oracle DB spisuje się naprawdę bardzo dobrze.
Co niby więcej może dać jakaś nierelacyjna baza danych niż najlepsza relacyjna, w której do konkretnego zastosowania można przecież nie użyć relacji?
Czy mówimy to o bazach hierarchicznych czy o obiektowych czy może o prostych mechanizmach w stylu Berkeley DB?
A może chodzi o używanie na masową skalę WebSphere MQ, który siłą rzeczy ma własną nierelacyjną bazę.
@abcman: “eventually consistent” czy “consistent” jest kwestią ortogonalną w stosunku do użytego modelu danych (relacyjny, obiektowy, hierarchiczny itp). Eventually consistent masz np. w klastrach z replikacją asynchroniczną.
Do tego wielu chyba myli No-SQL z nierelacyjnymi bazami – a to są dwa różne kryteria. Key-value store, który jest jednym z modeli przyjętych w bazach No-SQL, jest jak najbardziej relacyjną bazą danych. Tyle że jest inny interfejs i kwestie powiązań między relacjami są przerzucone na aplikację. Co ma pewne wady i zalety.
Jak napisał borizm, problem leży zupełnie gdzie indziej. Ponieważ RDBMSy starają się być systemami uniwersalnymi, to ich stopień komplikacji jest na tyle duży, że większość adminów nie potrafi powiedzieć, jak dokładnie baza działa w środku i trudno przewidzieć jak pewne decyzje wpłyną na skalowalność i wydajność. Zresztą nawet się tego nie uczy na uczelniach wyższych. Również stworzenie dobrego RDBMSa jest dużo trudniejsze niż bazki typu No-SQL. Rozproszoną hashmapę to pierwszy lepszy student na zaliczenie naskrobie (podobnie jak framework webowy albo CMS – stąd mamy ich tyle, zarówno bazek No-SQL jak i frameworków webowych i CMSów).
No i jest jeszcze taka kwestia, że nie wszyscy potrzebują full-wypas systemu bazodanowego – w wielu sytuacjach rozproszona hashmapa jest właśnie wystarczającym rozwiązaniem.
Jeszcze jedno:
“mitów typu (join jest szybszy od IN) ”
ak47: nie sądzę, żeby to był mit, o ile mówimy o optymalizatorze pokroju Oracla, a nie MySQLa. Z tego co się orientuję, to Oracle przepisuje podzapytania z IN na SEMI-JOIN domyślnie (SEMI-JOIN jest zawsze co najmniej tak samo szybkie jak IN, o ile da się przepisać), jeszcze przed optymalizacją kolejności złączeń. Pisałeś to w kontekście Oracla, czy jakiejś innej bazy?
@królik
“mimo że jest to zależne od ilości wartości w złączeniu”
którego słowa nie rozumiesz?
czasem nie ma sensu robic joina z wielka tabela jeśli wiemy że podzapytanie z niej zwróci nami kilka wartości.
@ak47: rozumiem treść, ale się nie zgadzam z tym, że jest to zależne od liczności łączonych relacji, w taki sposób jak piszesz. Zapominasz, że planner ma do wyboru kilka algorytmów wykonywania złączeń. Jeden z nich – Nested Loops Join przekłada się na identyczny ciąg operacji w warstwie wykonawczej, co wykonanie podzapytania. W przypadku, który opisujesz po prostu ten algorytm zostanie użyty i nie będzie różnicy.
W wielu innych przypadkach takie przepisanie daje szanse na Sort Merge Join / Hash Join / Block Nested Loops, co jest wydajniejsze.
Oczywiście może zdarzyć się sytuacja, że planner się pomyli i wybierze zły algorytm złączenia, ale to jest raczej wyjątkowa sytuacja (i wtedy przyjrzałbym się statystykom, ewentualnie dał mu hinta).
@krolik
chodzi o to że mając złączenie 5 tabelek gdy wiemy że złaczenie 3 z nich przy warunku where dadzą na kilka wartości to często lepiej jest zrobić podzapytanie, jako warunek where złączenia 2 tabel. Co do planerów to jest tylko automat, więc może mu nie wyjść …
@ak47: masz rację, że automatowi może nie wyjść*, jednak automat ma tę przewagę, że potrafi dostosowywać plany do aktualnych danych w bazie (o ile admin nie jest debilem i włączył tworzenie histogramów i innych statystyk). Jak zahardkodujesz ręcznie plan zapytania (np. za pomocą hintów albo przez złożone podzapytanie którego QRW nie potrafi przepisać), to tej elastyczności juz nie ma. I system, który działał dobrze na początku, gdy było mało danych, po roku zaczyna mulić, bo nagle z 10 iteracji podzapytania zrobiło się 10000.
*) w dobie optymalizatorów samouczących się, to jest coraz rzadsza rzadkość
@królik
czasem trzeba być mądrzejszym niż automat, chodzi mi sytuacje gdzie zawsze niezależnie od przyrostu danych będzie kilka rekordów w wyniku.
Jeśli zawsze będzie tylko kilka rekordów, to trochę dziwne by było, żeby optymalizator tego nie zauważył. Uczący się optymalizator, taki jak w DB/2, nie “głupi” jak w PgSql
Tak, już minusujecie, bo myślicie, że skrytykowałem PgSQL.
A chodzi tylko o to, że optymalizatory można podzielić na uczące się i na nieuczące się. Nieuczące się są po prostu “głupie” – zawsze stosują się do wzorów wbudowanych w program i mogą tysiąć razy wygenerować ten sam zły plan. Taki optymalizator jest m.in. w MySQL, PostgreSQL i SQLite.
Natomiast uczące się, potrafią “wyciągać wnioski” ze swoich błędów. DB/2 umie np. przerwać w połowie wykonywanie zapytania, jak się zorientuje, że źle oszacowało krotność złączenia, powrócić do optymalizacji tym razem z nowymi danymi o krotności i znaleźć lepszy plan. Informacje te są wykorzystywane później dla następnych zapytań.
@królik
jedni nie wiedzą o czym mówisz drudzy uważają że zealocisz więc daj se na wstrzymanie
- No jak tam Wania, byliście na tym zgniłym zachodzie. Widzieliście jak kapitalizm umiera?
- Widzielim, towarzyszu sekretarzu, umiera ale to piękna śmieć jest.
Owszem, relacyjne DB nie umierają taką śmiercią jak np. IE6, ale i tak problem polega na tym, że nagminnie stosuje się relacyjne bazy danych WSZĘDZIE, nawet tam, gdzie nie jest to wskazane.
Racja.
Ale o tym umieraniu RDBMSów to słyszałem już na początku lat 90-tych. Wtedy miały być wyparte przez bazy obiektowe i logiczne, czy jakoś tak.
Bzdura – tam, gdzie relacyjność nie jest potrzebna, POWSZECHNIE stosowana jest np. BerkeleyDB.
@Królik – załóżmy, że mamy zrobić system, który bardzo wiele wymaga od bazy danych. I jest to system obiektowy (napisany np. w PHP5 albo w Javie). To jak byś wybrał:
a) RDBMS z ORM,
b) non-RDMS obiektowy?
Umieranie RDDMS jest długie, ale ludzie robiący duże systemy spodziewali się tego umierania ze względu na kłopoty wydajnościowe ORM-ów.
Wybrałbym dobry RDBMS z ORMem.
Po prostu dobre RDBMSy są lata przed dobrymi ODBMSami, jeśli chodzi o wydajność. Dobrze skonfigurowany ORM wspomagany lekko procedurami składowanymi wydajności nie szkodzi.
Problem z wydajnością nie leży w samym ORMie, a w modelu obiektowym. W modelu obiektowym nie możesz wyciągnąć z bazy ćwierć obiektu. W modelu obiektowym również sposób pracy z obiektami jest inny – zwykle wyciąga się jakiś obiekt, a później przechodzi po referencjach do innych obiektów. Takie łażenie po referencjach jest niezłe bo wygodne i wydajne, gdy wszystko siedzi w RAM, ale tragiczne gdy większość danych jest na dysku.
Weź wywal RAM z kompa i zobacz jak szybko chodzą “obiektowe” programy jak muszą swapować.
W modelu relacyjnym podejście jest inne – zapytać od razu o potrzebne dane i dostać wszystko na raz.
W przypadku ORMów mogę robić takie obejścia i nadal korzystać z bazy w nieobiektowy sposób zwiększając wydajność. Nawet mogę zejść do SQLa, jesli zajdzie taka konieczność.
Zresztą ODBMS to co to jest w praktyce? RDBMS z ORMem, tyle że ten ORM siedzi sobie wewnątrz tej samej paczki zwanej systemem baz danych i jest lepiej zintegrowany.
Tę tendencję już widać od jakiegoś czasu.
Ostatnio giganty odwracają się od MySQLa, czy szerzej SQL w ogóle.
Np. Digg: http://www.unixmen.com/news-today/875-digg-says-yes-to-nosql-and-bye-to-mysql
http://en.wikipedia.org/wiki/NoSQL
Nie widzę sensu. W czym to będzie lepsze od SQLite? Ja wiem – nie mój czas i nie ja to robię – ale “po co?”.
Po co mnożyć istniejące już i sprawdzone byty? Jeśli już polscy programiści coś chcą zrobić, to może by tak coś naprawdę potrzebnego? Np. dobry, otwarty OCR rozpoznający polskie znaki, rozpoznawanie i synteza polskiej mowy itp?…
Synteza polskiej mowy jest już zrobiona (vide: Ivona).
Ale poza tym zgadzam się z resztą. Dodałbym jeszcze taki mini-apel do Autora LightDB, aby chociaż zmienił koncepcję swojej bazy danych.
To znaczy, niech nie opiera jej na modelu relacyjnym lecz wybierze jakiś inny model (np. klucz-wartość). Zasadność takiego ruchu polega na niepowielaniu wysiłku programistów tworzących lżejsze wersje MySQL i na tym, że nie ma teraz (o ile ja wiem) dobrej bazy np. typu klucz-wartość, która byłaby lekka (także dla embedded) i wysokowydajna (bo bez warstwy abstrakcji, jakim jest model relacyjny z jego abstrakcyjnymi pojęciami w rodzaju relacji, krotek, atrybutów, które rozdmuchują i komplikują samą bazę).
Niby jest DB4, ale ma kiepską licencję (nie do zastosowań komercyjnych za free).
Jakby zrobili wreszcie transakcyjnego, skalującego się RDBMSa na wiele maszyn to byłoby coś. No, ale to jest trudne.
Mają jeszcze raz wymyśleć PostgreSQL?
pozdr,
fEnIo
W którym miejscu się PostgreSQL skaluje na *** wiele maszyn ***?
Gdzie są:
1. sharding / partycjonowanie poziome,
2. replikacja master-master
3. replikacja master-slave (warm-standby się nie liczy, bo to nie to samo)
4. obsługa baz rozproszonych (federacyjnych)
BTW: gotar w tej kwestii ostanio chyba jakiś research robił…
ad 1. pgpool2 (w kontekscie wielu maszyn) partycjonowanie w kontekscie jednej maszyny też istnieje
ad 2. bucardo, z darmowych, są także płatne rozszerzenia
ad 3. slony
ad 4. nie slyszałem o takich rozszerzeniach ale schematy są, two fase commit też jest więc co za problem?
ad 1. ma “single point of failure” jakim jest sam demon pgpool i bardzo długą listę “restrictions”. Poza tym dokumentacja do shardingu jest napisana niegramatycznym angielskim, którego nie sposób zrozumieć. Skoro nie potrafią nawet dokumentacji poprawnie napisać, to skąd mam mieć gwarancję, że na produkcji nie rozwali to mi danych?
ad 2: niech będzie
ad 3: hack na triggerach, ale niech będzie
ad 4: czyli nie ma
@ak47: to wszystko są protezy, wybacz ale nie będę eksperymentował na produkcji zestawem, który w całości nie jest dostatecznie przetestowany (bo nie jest używany, bo nikt mi nie da gwarancji czy supportu, ot co).
bucardo – skrypt w perlu, slony – zestaw triggerów, tak na prawdę tylko w pgpool-II mogę pokładać jakąś wiarę, że nie wyśle mi danych w kosmos, ale nim samym zbytnio nie poskaluję.
A w samym silniku też mocne ograniczenia – wczoraj pół dnia walczyłem z zapisami hint bits przy odczycie (w systemie, o którym wspomniałem niżej, gdzie tak na prawdę nie jest mi potrzebna baza relacyjna, a tablica jest INSERT/READ-only, więc nie ma żadnych starych tupli, nie ma też problemu jak jakieś dane by się zgubiły, bo to tylko statystyki i monitoring). Wcześniej do tej samej bazy musiałem stworzyć ręcznie 16 indeksów, każdy ma obecnie po 15 MB i będę musiał je przerobić na 256 – znowu ręcznie, bo o ile nawet autopartycjonowanie wejdzie do 8.5, to bez hashowania (a już sobie wyobraziłem tworzenie 256 dziedziczonych tabel z rulami i triggerami do obsługi tego, dlatego spartycjonowałem sam index). Brak covering index też nie jest zaletą.
Z powyższego jedynie problem pierwszy ‘rozwiązałem’, wpisując do crona ’select count(*) from table where date>now()-’2 days’::inverval’…
Z rzeczy trywialnych – nie da się przestawić kolejności kolumn. Ta z pozoru zbędna cecha jest przydatna, gdy tworzy się tabele z historią zminan – tabela docelowa ma mieć o 1 kolumnę więcej, niż źródłowa (z datą modyfikacji, ustaloną na now()), a trigger do przeniesienia postać ‘INSERT INTO ‘hist_’||TG_ARGV[0] VALUES(OLD.*)’ – co się posypie od razu po dodaniu dowolnej kolumny, gdyż w tabeli pierwotnej wskoczy na miejsce N, natomiast w tabeli z historią zmian na N+1 (za dodatkową kolumnę z czasem).
Każdy chyba kto pracuje z bazami prowadzi jakiś indeks ograniczeń – mi już brakowało przekazywania NEW do funkcji, ustalania kolejności w UPDATE (co ma znaczenie przy indeksach UNIQUE), ustalania defaulta na wartość z innej kolumny no i wreszcie brak możliwości sortowania po wyrażeniu przy UNION.
“Brak covering index też nie jest zaletą.”
Nawet jest bardzo dużą wadą.Dopóki tego nie zrobią, nie mają szans mierzyć się wydajnością z Oraclem.
Z tego co jednak było dyskutowane na listach dyskusyjnych postgresa, to szanse, że to się kiedyś zmieni są bliskie 0. Musieliby przebudować sposób zarządzania transakcjami i sposób trzymania indeksów. Indeksy nic nie wiedzą o tym, które rekordy są widoczne dla bieżącej transakcji, a które nie. Modyfikacje samego plannera w porównaniu z tym to już pikuś.
@gotar
możesz zapłacić za mamothdb czy enterpricedb za supprcik i kilka dodaków. Na slonym można zrobić bardzo dużo jeśli masz sporo więcej odczytów niż zapisów, Robi się kilkopoziomowe drzewko i można naprawdę spory ruch przemielić.
pierwszej części twojej wypowiedzi nie rozumiem. Index 15MB ? coś masz tam mało danych … 16 indeksów? ile z nich wykorzystujesz? ile z nich dało by się zmergować do indeksów wielokolumnowych?
256 tabel dziedziczących? Checki są kosztowne więc przesadzanie z ilością tabel dziedziczących nie wyjdzie ci na dobre… W dodatku partycjonowanie ma sens przy tabelach powyżej ~40GB gdzie partycja ma minimum ~2GB a większość zapytań mieści się tak naprawdę tylko w jednym/dwóch setach.
Nie będzie postgresa 8.5 będzie 9.0.
druga część:
Tak się objawia stosowanie gwiazdek w zapytaniach … z ustawianiem kolejności kolumn spotkałem się tylko progressie. Jak sobie zrobisz rule z gwiazdką to i tak ci to postgres zamieni na konkretne wartości.
część trzecia
new w funkcji ? funkcja trigger?
kolejność czego w update?
default na podstawie innej kolumny? niepotrzebna duplikacja danych załatwia się to widokiem aby dostać piękną “rozszerzona tabelkę” lub brzydko używając ruli/trigerów i mieć hard write w tabeli.
sortowanie union (częsci uni)to trochę bardziej skomplikowane niż ci się wydaje. Sortowanie to warstwa wizualizacji danych a tych cząstek danych nie widzisz tak naprawdę. Do obejścia funkcją.
Jeśli możesz wejdź na #python.pl irc.freenode.net to pogadamy “na żywo”
@ak47 – z płaceniem to jest tak, że ten kto wykłada gotówkę chce wiedzieć na co, a z dwóch jakie wymieniłeś sam znam tylko EnterpriseDB. Zatem (pomijając już nawet kwestię dostępności profesjonalnego supportu w Polsce) gdy pojawiają się pieniądze, zwykle ktoś (projektant systemu, wdrożeniowiec, whatever) wspomni o tym Oraclu. W moim np. przypadku Oracle i tak miał być, bo był potrzebny do innego zamkniętego systemu, ale że go jednak nie będzie, mam jeszcze nieco możliwości szukania rozwiązań postgresowych.
Proporcji odczyt/zapis: w systemach, o których pisałem wcześniej, mam 99,99% zapisów (w tym, który obecnie jest tworzony, nie mam na razie pojęcia, jest w końcowym etapie projektowym, przed optymalizacjami).
Mam 16 indeksów częściowych obejmujących jedną kolumnę (macaddr). Gdy index był jeden i miał 200+MB system był nieużywalny. Teraz wiem, że duży wpływ na to miały hint bits, ale nawet po ich zapisaniu przy obecnych 15MB indeksach odczyt (zaznaczam: korzystam z jednego z nich na raz) trwa kilka sekund (wcześniej było ok. 30). A tabela duża nie jest – nieco ponad 18,5M rekordów, każdy średnio do 100 bajtów danych (timestamp, macaddr, inet, varchar(8), varchar(16), varchar(16), varchar(192), varchar(64), int4). Do tego 8 indeksów częściowych na inet oraz po jednym na int oraz timestamp (czyli zindeksowane jest wszystko ≠ varchar). Partycjonowanie tutaj ma oszczędzić jedynie na I/O, bo CPU się raczej nudzi. Na dobrą sprawę indeksy obejmują połowę danych z tabeli… Indeksy rozdzielane są na podstawie konkretnego oktetu (i tu przydałaby mi się automatyka stosująca hash), a ponadto musiałem dopasować zapytania tak, aby tego indeksu używały (postgresowy planner słabo sobie radzi z wyłapywaniem zależności nie podanych explicite i potrafi pominąć pasujący index).
Mam jeszcze identyczną bazę, ale o rząd wielkości większą – chyba 150GB wyszło w momencie, gdy ją odłączyłem.
Nie mam ich w zapytaniach, chciałem mieć jedną funkcję zakładaną jako trigger na wybranych tabelach no i niestety musi być znacznie bardziej skomplikowana niż ta, którą podałem (miało oczywiście być TG_RELNAME).
Zbyt duży skrót myślowy – chodzi o sytuację, w której na tabeli X chcę założyć trigger do sprawdzania wartości z kolumny A, natomiast na tabeli Y z kolumny B; czyli muszę do triggera przekazać nazwę kolumny do sprawdzenia. I tutaj wydaje mi się, że próbowałem użyć NEW.TG_ARGV[x] i jeśli dobrze pamiętam (pisałem to w okolicach 7.1), to był z tym problem, ale rozwiązałem na około.
Właśnie samego update: update table set unique_column=unique_column+1.
To nie jest niepotrzebna duplikacja, tylko zwyczajna domyślna wartość. Nie rozumiem, w czym podanie konkretnej wartości czy funkcji (jak now()) miałoby być gorsze od wskazania, że domyślnie ma być tyle, co w innej kolumnie. Wiem, jak to się obchodzi – i właśnie to jest brzydkie, bo zamiast prostego SET DEFAULT muszę pisać funkcję. Równie dobrze można postulować wywalenie wartości domyślnych (też można dopisać z ręki), CHECKi (co, nie da się sprawdzić funkcją?), klucze obce (no, też można odpytać wprost, czy nie psujemy zależności), a stąd prosta droga do pisania wszystkiego samemu w C.
Rzecz w tym, że tam nie może być żadnego wyrażenia – nawet 1+1, nieodnoszącego się zupełnie do danych ‘zagubionych’ już pod spodem.
Może korzystając z okazji przedstawię osobno swój obecny NIErozwiązany problem z postgresem (bo pozostałe to jakimiś funkcjami czy dziwnymi hackami załatwiłem) – klasyczny ‘worek na dane’: tabela ok. 20M rekordów postaci
timestamp, macaddr, inet, int4, 5 varcharów (jeden z nich to tak na prawdę ENUM)
zapisywana dzień i noc (30k rekordów dobowo), odczytywana sporadycznie dla konkretnego macaddr lub inet (z rzadka enum, to można pominąć). Pytanie: co jest źle, co powinno być zindeksowane lub jakkolwiek zrobione prawidłowo, aby odczyt powiedzmy 100 ostatnich rekordów nie trwał 10 s?
Drugi problem, jaki mi wisiał, właśnie rozwiązałem, do trzech razy sztuka:)
wiesz pomaganie komuś pod takim artem nie ma większego sensu.
wejdź na irca pokaż kilka planów i zapytań to się pomyśli …
Postaram się wejść jak znajdę chwię wolnego czasu. Plan dla mnie wygląda OK, tylko I/O szaleje, ale może czegoś nie wiem.
A może technologia OCR ich nie interesuje. Zajmowałbyś się hobbystycznie czymś, co cię nie interesuje?
Ja widzę sens tego projektu. Jest wiele miejsc gdzie PostgreSQL/MySQL to “za dużo”, a sqlite to obecnie “za mało”. Widzę np. coś w stylu pół osadzonego serwera poczty, który posiada parudziesięciu użytkowników. W każdym razie każdy przypadek gdzie danych nie ma bardzo dużo ale jest potrzebna już jakaś kontrola dostępu do bazy. Serwerek, na nim parę stron a’la blog + prosta poczta chociażby.
Fakt, że to musi mieć jakąś zaletę nad MySQL, który obecnie w takich konfiguracjach występuje. Może być prostszy do postawienia, skonfigurowania, może być lżejszy (pamięciowo pewnie da radę). Na upartego może im się uda zrobić żeby w niektórych konfiguracjach był szybszy (per analogiam do lighttpd) w co akurat wątpię. Czas pokaże.
LightDB można raczej porównywać do uSQLiteServer http://users.iol.it/irwin/ Główna zaleta to technologia klient-serwer i affinity mode w sqlite. Główne wady są także dziedziczone z sqlite.
Idealne rozwiązanie dla wszystkich, którzy nie chcą/muszą używać mysql/pgsql by obsługiwać bazę danych na odległość (przypominam, że sqlite to tylko silnik bazy danych działający lokalnie na plikach – nie jest to serwer).
Pijoter
Powiem tylko tyle, po co?
Nadchodzą czasy baz danych typu klucz wartość takich jak
CouchDB, MongoDB, Redis … je warto rozwijać i im się przyglądać
To może ktoś kto się na nierelacyjnych bazach bardziej niż ja zna, będzie mi mógł doradzić co wybrać – potrzebuję systemu do gromadzenia ok. 7 mln rekordów dziennie przez okres powiedzmy 5 lat, czyli jakieś 13 mld, każdy z nich zawiera czas, adres IP, jakieś opisy itp. Z systemu rzadko coś jest odczytywane, ale jeśli już to potrzeba wyszukiwać korzystając z adresów sieci (tj. odpowiednik postgresowego ‘1.2.3.4′ << '1.2.3.0/23') oraz czasu określonego jako 'godzina XX:XX ± 10 minut'. Z racji rozmiaru i rzadkiego dostępu dane powinny być kompresowane.
Drugi system gromadzi mniej, bo ok. 30k dziennie, podobnych danych – czas, IP, MAC, ENUM, tekst, wyszukiwanie odbywa się poprzez IP lub MAC i tu musi być krótki czas dostępu do powiedzmy ostatnich 100 rekordów z danego adresu. Dane mają charakter statystyczny.
Oj, śmierdzi mi tutaj retencją danych… Pewnie się nie da zrobić.
Myk w tym, że nie ma powodu, by relacyjne bazy radziły sobie jako bazy klucz-wartość. Model relacyjny nie wyklucza tego użycia, ani w niczym nie przeszkadza. Że niektóre implementacje baz danych skalują się słabo to inna sprawa. Ani MySQL, ani PostgreSQL nie były projektowane z myślą o skalowalności.
Teraz mam właśnie projekt z MongoDB. A co do powyższego – stawianie tylko na PHP to spore niedopatrzenie. Bez API dla innych języków niewiele z tego będzie, a jeżeli wymaga to do PHP własnego rozszerzenia to praktycznie nikt nie będzie tego używał bo 99,99% serwer nie będzie oferować tego rozszerzenia (projekt musiałby być naprawdę dobry i wbić się do głównego wydania PHP), a zalet nad innymi rozwiązaniami – zero. Nie jest to sprawdzone MySQL, proste SQLite, czy wysoce skalowalne bazy dokumentów (MongoDB, CouchDB), czy zupełnie minimalistyczne i skalowalne jak Tokyo Cabinet / Tokyo Tyrant.
Coś tam naklepali, ale nic co wzbudzałoby obecnie zainteresowanie. Tak strasznie uniwersytecko
A czy zaglądał ktoś z Was do kodu źródłowego? Są to bardzo słabo owrapowane źródła sqlite. Osobiście nie uważam takich inicjatyw za dobre, właśnie z powodu niskiej jakości kodu tworzonego w ramach takich projektów: ‘napiszę lepszą bazę niż ‘.
Zresztą podobna sprawa była jakiś czas temu z supertajnym polskim systemem operacyjnym Pionieer.OS. Dużo szumu mało treści.
A czy ktoś odnotował fakt, że Sqlite zostało w całości przepisane na C# i jest możliwe natywnie do uruchomienia wszędzie tam, gdzie jest .Net lub Mono? To może być jedna z dróg dla tych, dla których MS/MySQL to za dużo.
> Zresztą podobna sprawa była jakiś czas temu z supertajnym polskim
> systemem operacyjnym Pionieer.OS.
To faktycznie musiał być “supertajny” – bo pierwsze słyszę…
http://tech.wp.pl/kat,1009779,title,Scisle-tajny-projekt-polskich-programistow-PioneerOS,wid,11810341,wiadomosc.html?ticaid=19d43
dawno nic nie poprawiło mi humoru jak ten “news”.
Wrappera to każdy głupek potrafi zrobić, jak już cały silnik z każdym możliwym interfejsem gotowy.
“LightDB. Free, opensource server software based on SQLite database.
Copyright (C) 2010 Michał “Dynax” Korman
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.”
Jak już wspomniano wrapper/interfejs dość łatwo jest napisać, co pewnie jest też powodem, że SQLite nie ma dystybuowanych ze sobą jakiś wrapperów lub nietypowych interfejsów (ale jest command-line).
Zainteresowała mnie inna sprawa – przechrzczono licencję, a raczej jej brak (US Public Domain), na GPL. Uniemozliwi to w krótkim czasie (również atorowi) wydajne dodawanie rozszerzeń z kodem niezgodnym z GPL3, choćby GPL2+, LGPL, Apache lub MPL. Wybór choćby LGPL albo licencji dualnej byłby nardziej na miejscu, choć zmiana na GPL pewnie miała swoje uzasadnienie i autor ma do tego prawo.
Chciałbym też wspomnieć (a trochę dokładnie w tym temacie grzebałem), że z powodu wspólnego 99% (jak sądzę, póki co) kodu z SQLite, LightDB nie będzie zbyt szybko “pobłogosławiony” przez dystrybucje takie jak Debian czy Fedora w oficjalnych gałęziach, zakładając że projekt wypali. Jest tak, gdyż nieuzasadnione forki nie są paczkowane ze względu na pracochłonność samego zadania i aktualizacji bezpieczeństwa.
Używanie więc libsqlite jako biblioteki dzielonej, bez forkowania i rozwijanie frontendu zawierającego dodatkowe funkcje poprawiłoby sytuację. SQLite jest tak złożonym programem, że utrzymywania aktualizacji po forku to nietrywialna praca na którą nie zdecydowały się największe koncerny (bo po co?). Fork nawet przy wyjątkowo aktywnym zespole go robiącym może się zestarzeć (tak by z IBM Lotus Symphony – forkiem oo.org 1.x).
Autor ma prawo do zmiany licencji na dowolną inną. IMHO, licencja GPL jest najbezpieczniejsza, dla RDBMS, o ile nie jest to rozwiązanie embeded i nie stosuje się GPL do kodu konektora/sterownika.
Wychodzisz z założenia, że domena publiczna jest rozpoznawalna w Polsce. Moim zdaniem nie jest to tak proste. Public domain pozbawia autora kodu wszystkich praw, pytanie czy kontekście polskiego ustawodawstwa istnieją prawa niezbywalne?
Prowadzi to paradoksalnych sytuacji. W części krajów Richard Hipp (autor SQLite) nie ma żadnych praw do swojego kodu, a np. w USA nadal je zachowuje, bo domena publiczna nie jest tam rozpoznawalna. Firmy z USA, które chcą skorzystać z SQLite proszą o specjalny glejt od Richarda.
Nie wiem czy tak samo nie powinni zrobić twórcy LightDB, bo sytuacja public domain w Polsce jest co najmniej niejasna. Doktor Hipp sam przyznał, że gdyby wiedział o problemach związanych z domeną publiczną wybrałby licencję podobną do BSD etc.
Jest to problematyczne, ale domena publiczna jest rozpoznawalna, w szczególności należą do niej utwory nieobjęte prawami autorskimi (np. dokumenty urzędowe) oraz utwory, co do których ochrona wygasła (zazwyczaj 70 lat po śmierci autora).
http://www.ebib.info/2009/101/a.php?bednarek_tarkowski_szczepanska
Problematyczne jest natomiast zrzeczenie się majątkowych praw autorskich, czyli samodzielne przeniesienie utworu do domeny publicznej:
http://prawo.vagla.pl/node/7424
Nieprawda, tylko praw majątkowych.
Wystarczy zajrzeć do ustawy o prawie autorskim i prawach pokrewnych, art. 16 (autorskie prawa osobiste). Nie cytuję, łatwo samemu wygooglać.
@blinkkin komplikujesz:
- domena publiczna w PL nie obowiązuje (w uproszczeniu)
- licencja sqlite to w PL licencja niewyłączna typu “róbta co chceta”
- prawa autorskie osobiste są niezbywalne.. ale to tego przypadku nie dotyczy (co ciekawe w wielu krajach, w tym anglosaskich nie ma odpowiednika polskich praw autorskich)
- występowanie o glejt przez korporacje to specyfika prawa USA i.. korporacji. Nawet jeśli nie trzeba czegoś robić to się to robi, by mieć potwierdzenie na papierze (lub elektroniczne) na potrzeby audytu wewnętrznego i innych kontroli.
Witam, tak się składa, że to ja jestem autorem tego projektu. Wszystkim tutaj chyba należy się małe wyjaśnienie bo zrobiło się trochę szumu o nic.
Otóż projekt ten, nie jest ukierunkowany na podbijanie rynku nowościami, rozwój technologii i tym podobne. Serwer napisałem hobbystycznie, w wolnym czasie, jako taką “zabawkę” non-profit.
Co do porównywania LightDB do wrappera na SQLite jednak się nie zgodzę. Za LightDB przemawia kilka cech których sqlite nie posiada:
1) Dostęp z zewnątrz. Głównym zadaniem serwera była dynamizacja pracy sqlite’a. Najważniejszą cechą LightDB jest to, że dowolne aplikacje mogą łączyć się z zewnątrz na określonym porcie. SQLite jak wiadomo to tylko plik na dysku.
2) Wiele baz dostępnych w tym samym miejscu. Łącząc się z serwerem na określonym porcie, mamy dostęp do wielu baz, zamontowanych wcześniej. W zwykłym SQLite musimy parsować każdą bazę z osobna, jeśli potrzebujemy takiego mechanizmu.
3) Autoryzacja użytkowników. Na jednym serwerze może mieć konta wielu użytkowników na różnych poziomach uprawnień, z dostępem tylko do określonych baz. SQLite nie ma tego mechanizmu.
4) Szyfrowanie połączeń. Szyfrowanie połączeń odbywa się poprzez bezpieczny algorytm typu klucz Publiczny/Prywatny. Nie da się “podsłuchać” danych przesyłanych między klientem a serwerem, więc w bazie możemy przechowywać nawet informacje poufne.
Tak więc, myślę, że wokół projektu zrobiło się trochę za dużo szumu.
Pozdrawiam.
Autor, poza tym że stawia pierwsze kroki w programowaniu, to również nie zna SQLite. ATTACH DATABASE pozwala pracować na wielu bazach danych z poziomu “czystego” sqlite.
sqlite3_set_authorizer, uprawnienia na poziomie systemu plików…
Kod, który to realizuje jest tak skandaliczny, że na miejscu autora szybko zdjąłbym to z sieci. A następnie poczytał nieco o OpenSSL.
Oj tak. Kod sqlite jest bardzo starannie napisany i testowany. Kod LightDB to wprawka licealisty.
A gdyby wrzucić bazę do ramdysku? Czy ta baza miała więcej niż 8 MB?