Potęga widoków – część I
by jmail on sie.07, 2009, under SQL
Widoki Twoim przyjacielem
Wszyscy wiedzą, co to jest widok w Bazie danych?
Nie?
No to taką wiedzę musicie nabyć drogą dowolną. Bo dzisiaj zamierzam powiedzieć Wam trochę więcej na temat widoków. Rozpocznę od bazy danych w MySQL’u, którego osobiście nie lubię, ale będę opierał się o przykłady z XNovy, a tam jest tylko to paskudztwo dostępne – chociaż kto wie, może pokuszę się o migrację na PostgreSQL całego silnika. jFancy już na Postgre działa…
Ale do brzegu. Widok to taka wirtualna tabela, w której możemy przechowywać zawężone już znacznie wartości z tabel jakie znajdują się w bazie danych.
XNova przykład – mamy tabelę users w której mamy nawkładane takie stado niepotrzebnych informacji, które są w 90% wypadków nie używane, że szkoda gadać.
Załóżmy, że w grze mamy dostępne tylko 4 technologie (dla uproszczenia, żeby listingi były krótsze). Każde wywołanie strony powoduje wywołanie tej tabeli i jakiejś operacji dla niej.
Zazwyczaj zależy nam na szybkim działaniu, jednak to co się dzieje w takim wypadku w bazie danych to jest groch z kapustą. Dlaczego nie mamy przechowywać w widoku tylko wartości dla użytkowników aktywnych w ciągu ostatnich powiedzmy 90 minut? Dzięki temu co zyskamy? Zyskamy dzięki temu wszystko co niezbędne do przetwarzania interface’u dla gracza aktywnego. A więc do dzieła!
Założyliśmy, że będą to 4 technologie. Szpiegowska, i te trzy militarne co w grze występują. Zainteresowanych odsyłam na forum http://xnova-support.pl w celu pobrania silnika i zrozumienia o czym ja gadam.
Na początek więc przyjmujemy założenia. Wsadzamy tam niezbędne dane do działania użytkownika i będą tam dane użytkownika aktywnego z ostatnich 90 minut (ponieważ jestem późno w nocy wiec ja wsadzę dane z ostatnich 12 godzin – z 90 minut to ze dwudziestu może będzie
)
Tworzę widok
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | create or replace view users_v as select id ,username ,spy_tech ,military_tech ,defence_tech ,shield_tech from prefix_users where onlinetime > unix_timestamp() - 12 * 60 * 60 |
Teraz sprawdźmy czy nam to coś dało. Wykonuję zapytanie
1 2 3 4 5 6 7 8 9 10 11 | select id ,username ,spy_tech ,military_tech ,defence_tech ,shield_tech from prefix_users where onlinetime > unix_timestamp() - 12 * 60 * 60; |
Czas ok. 0,0130. Całkiem przyjemny – ale nadal trzeba zwrócić uwagę, że to jest przy nieobciążonym serwerze.
Teraz wykonuję prostsze zapytanie:
1 2 3 4 | select * from users_v |
Na wyjściu dostanę te same dane, jednak o ile prostsze jest zapytanie?
A jaki czas. Czas niestety zbliżony bo ok 0,0129. Więc dużo nie zyskaliśmy.
Moglibyście teraz powiedzieć i co mi ten widok da. Co da? Na ten temat porozmawiamy sobie w części drugiej. To taki mały wstępniaczek. W ciągu dnia jeszcze na obciążonym serwerze sprawdzę jakie czasy się uzyskuje i dam znać.