jak dobrze pisać update’y do bazy danych?

teoretycznie napisanie polecenia update jest bardzo proste:

update tabelka set pole = ‘xxx' where id = yy;

tylko czy to na pewno słuszny sposób?

otóż nie.

problem polega na tym, że w postgresie działa cos co nazywa się mvcc. nie wnikając w szczegóły (jak kogoś z was bardzo interesują, odsyłam do dokumentacji postgresa) – powoduje to, że każdy update to tak naprawdę delete + insert.

efekty – tabelka rośnie. rosną też indeksy na polach które nie zostały zaktualizowane!

zostałem przez ten efekt dosyć boleśnie “ugryziony" gdy okazało się, że dosyć spora tabelka (1.5 miliona rekordów, 5 gigabajtów wielkości) rośnie mi jak na drożdżach, bo bardzo często robię w niej update jednego pola. a że na tabelce jest 15 indeksów to efekt się multiplikował.

rozwiązanie? wykonywanie update'a tylko gdy naprawdę jest konieczny:

update tabelka set pole = ‘xxx' where id = yy and pole <> ‘xxx';

sprawa się nieco komplikuje gdy pole może być null'em, ale na szczęście jest (mało znany) operator “is distinct from", i możemy zapisać zamiast:

update tabelka set pole = ‘xxx' where id = yy and (pole is null or pole <> ‘xxx');

to:

update tabelka set pole = ‘xxx' where id = yy and pole is distinct from ‘xxx';

co istotne – jeśli już modyfikujemy choć jedno pole – to modyfikacje kolejnych nie mają tego złego efektu.

więc nie musimy robić:

update tabelka set pole = ‘xxx' where id = yy and pole is distinct from ‘xxx';

update tabelka set pole_2 = ‘x2' where id = yy and pole_2 is distinct from ‘x2';

itd.

wystarczy (i zdecydowanie lepiej zadziała):

update tabelka set pole = ‘xxx', pole_2 = ‘x2' where id = yy and (pole is distinct from ‘xxx' or pole_2 is distinct from ‘x2');
dodam jeszcze, że o ile vacuum świetnie sobie radzi z odzyskiwaniem miejsca po update'ach w plikach tabel, o tyle z miejscem w plikach indeksów nie jest tak słodko 🙁
inną opcją (dodatkowo pomagającą) jest:

jesli macie dużą tabelkę (kilkanaście kolumn, sporo danych) i tylko jedno/kilka pól jest często aktualizowanych, przy czym reszta danych (w szczególności indeksy) nie jest dotykana – warto się zastanowić by te kolumny wydzielić do oddzielnej tablicy i połączyć relacją 1-do-1.

od razu ostrzegam: to nie zawsze da dobry rezultat. ale może warto spojrzeć. zmniejszone pliki to zmniejszone zapotrzebowanie na pamięć do cache'a dyskowego. a więc cały system zaczyna szybciej działać.

sprzedaje samochod

sprzedaje swojego misia 🙂

jakby ktoś z was reflektował:

  • mitsubishi space star 1.3
  • kupiony 2001, w salonie, w polsce
  • jestem pierwszym właścicielem
  • serwisowany w aso (najpierw auto-gt na bielanach, ostatnio w mitcarze na spornej (warszawa))
  • przejechane niecałe 100000km
  • abs
  • 2 poduszki
  • klimatyzacja
  • radio z odtwarzaczem kaset
  • w pełni sprawny
  • ani ja ani nikt inny nie palił w środku

samochód nie ma jednego kołpaka (lewy przód) i ma lekko wgięty zderzak i klapę (słupek przy trawniku  – nie śmiecić, czy coś takiego). wgięcie jest minimalne, w niczym nie przeszkadza (można bezproblemowo zamykać i otwierać klapę bagażnika), lakier nawet nie odszedł od blachy. jest też ryska przy przednim lewym reflektorze oraz ktoś próbował otworzyć zamek w drzwiach.
jeśli ktoś z was jest chętny – proszę o kontakt. jakos się umówimy na oględziny/próbną jazdę.

cena – hmm .. na allegro chcą 26 tys lub 31.5 tys. jestem bardziej realistą – za 24 tys. oddam w dobre ręce 🙂

aha. – częste pytanie: czemu sprzedaję. bo pora nadeszła. serio. jeżdżę nim 5 lat, i pora wymienić. no i chciałbym coś większego.

mis3d.JPGmis1.JPGmis4d.JPGmis2d.JPGmis5d.JPGmis6d.JPGmis7d.JPGmis8d.JPG

youtube dla dorosłych

serwis youtube zna praktycznie każdy. każdy może uploadować film, otagować względem tego co zawiera i dać innym by oglądali i oceniali.

jednym z minusów (dla niektórych) jest fakt iż youtube ma dość restrykcyjną politykę nt. tego co może a co nie może być uploadowane.

na przykład nie można wgrywać pornografii. aby pomóc ludziom którzy kręcą swe prywatne życie na video i chcieliby się tym podzielić – powstał serwis pornotube.

funkcjonalnie jest praktycznie identyczny. każdy może wgrywać, odtwarzania flashem, tagi, oceny, linki, elementy social networking. tylko content trochę inny 🙂

najdroższe domy na świecie

mój poniekąd ulubiony serwis podał kolejne interesujące zestawienie – listę najdroższych na świecie domów.

całej listy nie będę cytował – nie ma sensu, chętni mogą poczytać. powiem jedynie iż najdroższy dom jest w anglii i jest wart 139 milionów dolarów (75 milionów funtów). ma 103 pokoje, 5 basenów, kino na 50 osób, korty do squasha i tenisa, tor do bowlingu (kręgle? jak to się po polsku nazywa) i podgrzewaną, marmurową, drogę dojazdową.

perl hacks – hit czy kit?

w firmie mamy kupioną książkę “perl hacks" napisaną przez chromatic‘a z damianem conwayem i curtisem poe.

książkę czytał znajomy, przeczytał. trafiła do mnie.

otworzyłem na chybił – trafił. i znalazłem taki o to kawałek:

zaczęło się od tego, że funkcja open() zwraca kod błędu. a lepiej by było by zwracała exceptiona.

rozwiązanie z książki:

use File::Exception;
sub open_file {
my ($name, $mode) = @_;
open my $fh, $mode, $name or File::Exception->throw( "file" => $name, "mode" => $mode, "error" => "$!" );
return $fh;
}

no i potem wszędzie w kodzie zamieniamy open(…) na open_file(…).

eh. i to ma być efektywne programowanie?

jakie widzę z tym problemy?

  1. konieczność doinstalowania nowego modułu. nie jest to problem per se, ale niepotrzebna czynność
  2. konieczność modyfikowania kodu – zamiana wszędzie open na open_file
  3. jeśli gdziekolwiek robimy własną obsługę błędu open() to nie możemy zamienić na open_file
  4. jeśli gdziekolwiek używamy open() do np. czytania z pipe'a, to też nie możemy zamienić

ogólnie – przerobienie istniejącego kodu w/g tej regułki uważam, za całkowitą porażkę.

a jak zrobić to sensownie? użyć standardowego w perlu modułu fatal:

use Fatal qw(open);

i to wszystko. nie trzeba przerabiać kodu – wystarczy jedna deklaracja. a jeśli gdzieś mamy własny handling? wystarczy zmodyfikować use'a:

use Fatal qw(:void open);

no i dodatkowo – fatal potrafi obsłużyć nie tylko open. zasadniczo można przez niego zrobić exceptiony do praktycznie każdej funkcji/builtin'a.

i w ten oto sposób zraziłem się do książki poprzez przeczytanie losowego kawałka. zobaczymy co będzie dalej.

monopoly porzuca gotówkę

monopoly – jedna z najpopularniejszych gier planszowych, na której wychowały się już pokolenia – przechodzi olbrzymią zmianę.

w najnowszym wydaniu nie będzie już banknotów!

zamiast nich będą karty kredytowe i czytnik do nich. producenci – firma parket brothers, podpisali umowę z visą, dotyczącą zaprojektowania kart do nowej gry. karty oczywiście nie będą działać w normalnych punktach, ale w grze tak.

do gry będzie dołączony czytnik/kalkulator umożliwiający korzystanie z kart.

zmiana jest interesująca. przyczyny oczywiste – coraz mniej ludzi używa gotówki. ale czy to się przyjmie? i jak szybko narodowe wydania podchwycą ten pomysł?

pojawia się drobny problem – standardowa wersja gry kosztuje około 13 funtów. nowa, bez banknotów, ale z kartami i czytnikiem, będzie blisko dwukrotnie droższa!

amd i ati – wreszcie oficjalnie razem

od kilku miesięcy słychać było plotki teraz plotki stały się rzeczywistością. amd i ati łączą się.

oczywiste są plusy – obie firmy robią podobne rzeczy, ale mają inny rynek, więc połączenie ma sens ekonomiczny w kontekście cięcia kosztów.
ale co z tym co połączenie da zwykłym użytkownikom?

czy procesory amd będą lepiej działały z gpu ati? jak tak, to fatalnie. lubię amd, natomiast grafikę nvidia ma w/g mnie lepszą. i gdyby miało się, okazać, że aby mieć dobrą grafikę muszę mieć nvidię z intelem – to amd finalnie przegra.

połączenie ma sens dla użytkowników tak naprawdę w jednej prostej rzeczy – możliwe staną się układy wielordzeniowe, o różnych funkcjach rdzeni. np. 2 rdzenie cpu i 2 rdzenie gpu w jednej kostce.

czy takie rozwiązania się pojawią? kiedy? ile to będzie kosztować?

permanent marker + tablica suchościeralna = ?

kiedyś zdarzyło się mnie. widziałem jak zdarzało się innym. chwila nieuwagi i mamy na tablicy suchoościeralnej śliczny nowy napis. zrobiony “permanentem". jak to zmyć?

standardowe metody: spirytus, zmywacz do paznokci – mają swoje wady – główną jest oczywiście zapach.

okazało się, że starcie takiego napisu jest proste. wystarczy:

  • w miejscu gdzie jest permanent napisać coś zwykłym markerem do tablic suchościeralnych
  • zetrzeć

działa cudownie. proste i skuteczne.

kill bill – nowe filmy

(jakoś mi ostatnio tematyka zeszła na filmy. nie wiem czemu. postaram się nadrobić technologicznie 🙂

klejny news z comic con 2006. quentin tarantion powiedział, że po zakończeniu prac nad “death proof" (dowód śmierci?), zacznie pracę nad dwoma nowymi filmami z serii kill bill'a. oba będą animowane. pierwszy z nich będzie prequelem killbill vol1 i będzie opowiadał historię bill'a. drugi natomiast nową historią głównej bohaterki (może jakieś wydarzenia post-kill bill v2?).

jako miłośnik tarantino w ogóle i kill bill'a w szczególe – czekam niecierpliwie. choć pewnie to kilka lat minie zanim będę miał szansę obejrzeć 🙁

wimbledon

właśnie obejrzałem w telewizji film “wimbledon" z paulem bettany (silas w kodzie leonarda da vinci) i kirsten dunst (dziewczyna spider-mana).

i spodobał się.

film jest komedią romantyczną. jest romans. jest komedia – muszę przyznać, że dużo zabawniejsza niż się spodziewałem.

film oparty jest na sprawdzonym schemacie – weteran sportu XXX gra mecz/turniej ostatniej szansy. zawsze przegrywał, a teraz dzięki miłości odnajduje siebie i odzyskuje wiarę w swoje umiejętności. bla bla bla.

motyw jest zasadniczo nieistotny. ten sam został użyty w tin cup z costnerem i rene russo. i o ile tamten film uznałem za porażkę (choć może to dlatego, że jakoś nie przepadam za costnerem), to wimbledon mi się naprawdę podobał.

jak macie w wypożyczalni lub wasza kablówka oferuje canal+ film, obejrzyjcie – świetny film na wieczór z kobietą/mężczyzną waszego życia. sporo pozytywnej energii przekazanej w przyjemnie oczywisty sposób.