Część grafik może być niedostępna w przeglądarkach bez obsługi
IDN.
Szef kuchni poleca:
Beefy Miracle t-shirts
O mnie
Planeta !apcoh
Social
Część grafik może być niedostępna w przeglądarkach bez obsługi
IDN.
Szef kuchni poleca:
Beefy Miracle t-shirts
O mnie
Planeta !apcoh
Social
osoby otrzymujące stypendium socjalne powyżej 400 złotych będą skierowane w przyszłym roku do ds 5Ł i ds3.Fajnie, tylko że jak lawina takich ruszy do DS3, to już pewnie nie starczy miejsca dla mnie. A mi się tu bardzo dobrze mieszka. Fuck.
,,Dzisiaj nie robicie trzeciego ćwiczenia -- powiedział prowadzący -- tylko kończycie drugie. Robicie taką aplikację, z takimi przyciskami, z tym i z tym i z tym i z tamtym. A, i macie tylko godzinę, bo muszę wcześniej wyjść.''
,,Wszystko w informatyce sprowadza się do baz danych.''Zapamiętałem to zdanie, chociaż wtedy uważałem je za przejaw sympatii owego informatyka. Sam byłem zainteresowany wyłącznie sieciami (i do dzisiaj w dużej mierze jestem) -- przesyłanie danych na różne sposoby, przez różne tunele, IPSeci, filtry, dynamiczne routingi, enkapsulacje i inne dziwne wytwory przez wiele lat pobudzało moją wyobraźnię i zajmowało długie wieczory oraz noce.
SELECT
i JOIN. I czuję, coraz mocniej z każdą chwilą, że
przetwarzanie danych kręci mnie coraz bardziej. Niedługo IPSeci
będę zestawiał tylko w celu zabezpieczenia połączenia z odległym
silnikiem SQL.,,They Know Where You Are''. Ciężkie.
Problem jest taki: mamy w bazie kolejne pola. Problemem jest to, ze
numeracja mimo, że sekwencyjna, jest nieciagla. Za zadanie
mamy odnalezienie poprzedniego pola w stosunku do $DANE, przy
czym nie ma byc on bardziej odległe niż 168 numerków do danego.
$akt_nr = $DANE-1;
do {
$query = "SELECT pole FROM tabelka WHERE numer='$akt_nr'";
$result = $dbh->prepare($query);
$result->execute;
$akt_gnr--;
} while (!(@row = $result->fetchrow) && $akt_nr > $DANE-168);
Zostanie wykonane maksymalnie 168 zapytań do bazy. Jest duża szansa, że
przepytywanie skończy się szybciej, zawsze jednak będzie to conajmniej
jedno zapytanie.I już! Czym różni się to zapytanie od poprzedniego? Po pierwsze, sprawdzanie warunku$query = "SELECT pole FROM tabelka WHERE numer<$DANE AND numer>$DANE-168 ORDER BY numer DESC LIMIT 1;"; $result = $dbh->prepare($query); $result->execute; @row = $result->fetchrow;
$akt_nr > $DANE-168
zastąpione zastało zawężeniem zakresu, z którego spodziewamy się wyników od bazy. Po drugie, życzymy sobie
posortowania wyników wg. numeru, w kolejności malejącej (DESC). Dlaczego? Ponieważ wtedy pierwszym
zwróconym wynikiem będzie ten o najwyższym numerze, za nim będzie o numerze mniejszym, potem jeszcze
mniejszym itd. Ponieważ interesuje nas najpóźniejszy wpis -- który zostanie zwrócony jako pierwszy -- ograniczmy
się tylko do pierwszego wyniku poprzez LIMIT 1. Pozostałe nie będą przepychane przez kanał
komunikacyjny program<->baza. Po co nam one, skoro i tak mają iść od razu do śmieci?$BEG do $END) numerów,
na których będziemy operować.
Numery, choć dyskretne, są nieciągłe -- niektórych brakuje. Do przeprowadzenia mamy parę
operacji na poszczególnych numerkach. Co robimy?
pętla {
[...]
$query = "SELECT pole FROM tabelka WHERE numer=$potrzebny;";
$result = $dbh->prepare($query);
$result->execute;
@row = $result->fetchrow;
if (defined($row[0])) { zrob_cos_z($row[0])};
}
Takich zapytań będzie $END - $BEG, co czasem daje sporo odwołań do
bazy. Kosztownych czasowo, zwłaszcza, gdy pobierane pole sklada się
np. z numerka i jakieś małej literki.
$query = "SELECT pole FROM tabelka WHERE numer>$BEG-1 AND numer<$END+1;
$result = $dbh->prepare($query);
$result->execute;
$hashref = $result->fetchall_hashref("numer");
pętla {
[...]
$nr = %$hashref->{$potrzebny}->{"costam"};
if (defined($nr)) { zrob_cos_z($nr); };
};
W ten sposób do bazy odwołujemy się raz, a nie za każdym przebiegiem pętli.
Wyniki otrzymujemy w hashu, można się do nich łatwo odwoływać przez poszukiwany
numer. Minusem jest zwiększone wykorzystanie pamięci przez naszą aplikację,
jednak przyrost szybkości prawie zawsze rekompensuje tą niedogodność.
Mając do wykonania większość ilość iteracji podobnych do tych w Przykładzie
pierwszym powyżej, należy się zastanowić -- czy dla każdego wyszukiwania
generować SELECT z odpowiednio zawężonym zakresem i LIMIT 1?
A może lepiej pobrać cały interesujący nas przedział za jednym zapytaniem i
używać pętli takiej jak w pierwszym kawałku kodu, zastępując jednak odpytywanie
bazy -- odwołaniami do poszczególnych pozycji hasha.
ModPerl::Registry -
pliki nie dają się otworzyć w takiej konfiguracji. Pozostaje ModPerl::PerlRun,
który wg. tego co piszą, jest o połowę wolniejszy.Apache::DBI to jakaś ściema - strona
nadal generuje się minimum 1,5s. ->prepare($SQL); na ->prepare_cached($SQL); nie
daje mierzalnej poprawy wydajności. ->prepare() i użyciem ->bind_param()
dały przyspieszenie - ponieważ zapytania do bazy przestały cokolwiek zwracać, obróbka
tychże danych była zdecydowanie szybsza.jabber:x:event w EKG2. Duży buziak za nią
dla Moniki, którą denerwowały komunikaty wpkontaktu, że wiadomości do mnie
nie dochodzą, bo potwierdzeń nie ma. Jedyny problem to leżący CVS,
więc nie mogę tego commitnąć. grrrr. Złośliwość rzeczy martwych. ,,::: Wiadomość do Zenka została dostarczona''.
Na koniec warto zauważyć, że gdyby wytwory Open Sourcy było tak popularne jak produkty Microsoftu, z dużym prawdopodobieństwem już dzisiaj nastąpiłyby poważne problemy w funkcjonowaniu całego Internetu.