Podstawy
4 godz. 8 min · Bazy Danych · Full-stack i Programowanie
Pierwszy rozdział wprowadza w historię powstania języka. Wspomnimy o standardach, wykorzystywanych wersjach i podzbiorach SQL’a. Zaraz potem wskoczymy w pierwsze poważne operacje, które pozwolą na pełny cykl tworzenia, zasilania bazy danych i wyciągnięcia z niej wybranych informacji. Rozwikłamy też tajemniczy akronim - CRUD.
Skoro potrafimy już tworzyć bazę i tabele, w które możemy wstawić nowe wiersze, dowiemy się więcej o bardzo ważnej funkcji bazy danych: weryfikacji danych. Zostaną zaprezentowane mechanizmy i techniki, które pomogą utrzymać spójność danych.
W kolejnych lekcjach znajduje się opis serca SQL’a, czyli polecenia wybierającego dane i możliwości i opcji z nim związanych. Od przekształcenia bazy danych w prosty kalkulator, aż do warunków filtrowania wybieranych danych (klauzulą WHERE), sortowania ich (klauzulą ORDER BY), czy ograniczania dużych zestawów wynikowych - w tym wsparcia do paginacji.
SQL jest językiem obsługi relacyjnych baz danych. Dlatego najwyższy czas, aby wspomnieć o relacjach i tym w jaki sposób rozszerzają one możliwości wyszukiwania danych oraz pozwalają zobrazować powiązania między danymi w bazie. Dowiesz się o różnych rodzajach połączeń między tabelami i jak te połączenia (zwane JOIN’ami) pozwalają wybrać to, czego potrzebujesz.
Kolejny rozdział dotyczy grupowania danych (wykorzystując klauzulę GROUP BY) i związanych z tym nowymi możliwościami. Dowiesz się tutaj też w jaki sposób agregować pogrupowane dane i jak takie zagregowane dane filtrować.
Przekonasz się, w jaki sposób można zapamiętywać trudne lub często wykonywane zapytania, wykorzystując do tego widoki (VIEWS) i jak można poprawić wydajność pobierania z nich danych. Przykładowo zastosujemy widoki zmaterializowane (MATERIALISED VIEWS). W tym rozdziale przećwiczysz też możliwość zapisywania danych przez widoki.
Z baz danych korzysta zwykle wielu użytkowników. Aby operacje, które wykonują na wspólnej bazie nie spowodowały nieoczekiwanych konsekwencji, wykorzystuje się mechanizm transakcji. W tym rozdziale wytłumaczymy Ci w jaki sposób użytkownicy mogą modyfikować równolegle te same dane. Tutaj też dowiesz się o poziomach izolacji transakcji i jak używać ich w różnych sytuacjach bazodanowych.
Przy pracy z większą ilością danych, bardzo szybko doświadczysz spowolnienia wykonywania zapytań. O tym jak je przyspieszyć dowiesz się właśnie w tym rozdziale. Zwiększanie wydajności zapytań jest tematem rozległym i zaawansowanym. Tutaj będziesz miał szansę poznać podstawy, w tym - po co są i jak używać indeksów, w jaki sposób analizować jak zapytania są wykonywane i jakie jeszcze są metody wydajniejszego odczytywania danych.
Kurs jest dla osób początkujących, rozpoczynających przygodę z bazami danych. Nie wymaga się znajomości SQL'a ani zaawansowanej wiedzy dotyczącej baz danych. Warto wiedzieć co to są relacyjne bazy danych. Dobrze mieć dostęp do ulubionego silnika bazy danych, ale nie jest to wymagane.
Jak wspomniałem wcześniej widoki używa się bardzo często do
zapisywania skomplikowanych zapytań takie zapytania mogą wykonywać
się długo szczególnie jeżeli operują na dużych zbiorach danych jeśli
nie musimy mieć danych z takiego widoku super aktualnych możemy go zmaterializować
co znacząco przyspiesza wykonanie takie przyspieszenie
jednak ma swój koszt gdyż widok zmaterializowany wymaga
ręcznego odświeżania zaraz po przedstawieniu rozwiązania
do zadania z poprzedniej lekcji pokażę ci jak się tworzy i jak
się używa widoków zmaterializowanych zadanie
polegało na stworzeniu takiego widoku armor equipment a
następnie przerobieniu go tak żeby można było zapisywać element
ekwipunku do tabeli ja stworzę sobie
ten widok teraz mogę spróbować zapisać coś
do tabeli ekwipunku mam tutaj zapytanie
zapisujące nowy kawałek ekwipunku ponieważ widok
zwracam mi wszystkie kolumny więc mogę sobie wybrać te do których chcę
coś zapisać no niestety nie można dlatego że widok
nie spełnia warunków widoku zapisywanego na
przykład silnik bazy podpowiada że powinien mieć odwołanie do pojedynczej
tabeli albo w widoku można oczywiście w takiej sytuacji zastąpić
to odpowiednim triggerem ale triggery to materiał
już bardziej zaawansowany jeżeli jesteś zainteresowany tym
tematem zachęcam cię do spojrzenia na kursy sql
zaawansowane w takim razie musimy coś zmienić ponieważ
nie interesują nas w ogóle dane dotyczące bohaterów więc możemy po
prostu tego joina wyrzucić stąd i to powinno zadziałać teraz
jeszcze musimy zmienić to zapytanie tworzenia widoku na takie
które pozwoli nam zaktualizować widok to
do tego służy słowo or replace co powoduje
że taka kwerenda też zaktualizuje nam widok
w tej chwili został zaktualizowany i możemy
coś do niego zapisać ciach mam nadzieję
że udało ci się podobną zmianę wprowadzić i też możesz
już zapisywać elementy ekwipunku używając tego widoku no
dobrze o co chodzi z tą materializacją jako przykład stwórzmy
sobie zapytanie które będzie agregowało dane z naszej wielkiej tabeli
szuka ona potrójnych wystąpień tej samej losowej
wartości z pierwszej kolumny i przy
okazji agreguje dane w pozostałych kolumnach
tutaj skraja teksty do tablicy a tutaj
wylicza średnią wartość ceny zobaczymy
ile mamy w tej chwili danych w naszej tabeli
730 000 i wykonanie tego
zapytania agregującego dane zajmuje
minutę 800 czyli
niecałe dwie minuty czas wykonania zależy od wielu czynników mocy
procesora jakości dysków twardych oczywiście ilości danych do
przetworzenia dlatego nie zdziw się jeśli u ciebie to zapytanie będzie
miało inny czas wykonania w przypadku kiedy będzie ono bardzo
szybkie poniżej powiedzmy pół sekundy dodaj więcej danych
do tabeli tak żeby baza musiała się troszkę napracować
te niecałe dwie sekundy które tutaj uzyskaliśmy to jest całkiem
spory czas jak na taką ilość danych no ale nie używam tutaj żadnych
przyspieszaczy jak na przykład indeksów a baza nie
jest zoptymalizowana żeby ułatwić sobie korzystanie
z tego zapytania stworzę tutaj widok w
ten sposób mamy widok i możemy do tego widoku się teraz odwołać
ale
czas wykonania oczywiście jest podobny i tu z pomocą przychodzą widoki
zmaterializowane wtedy kiedy dane nie muszą być super
aktualne a liczy się czas wykonania widok zmaterializowany
tworzy się podobnie jak zwykły dodamy
jeszcze usunięcie starego widoku dodajemy do tego frazę
materialize oznaczmy sobie w nazwie że
jest to zmaterializowany widok i
w tym momencie ten widok zostanie uruchomiony różnica
przy tworzeniu widoku zwykłego a zmaterializowanego polega na
tym że przy zwykłym po prostu zapisuje się definicja widoku
z kwerendą tam zamkniętą natomiast
zmaterializowany widok uruchamia kwerendę która jest
jego definicją i zapisuje dane
które wynikają z tej kwerendy takiej jakby tymczasowej
tabeli w tym momencie możemy zobaczyć że jeżeli się odwołamy
do tego nowego widoku to czas wykonania
jest bardzo szybki jeżeli się popełnia błąd w
zapytaniu ale jak nie ma błędu to czas
zapytania jest bardzo mały 300 milisekund tak czyli
jedna mniej niż 1/5 czasu wykonania oryginalnego
zapytania oczywiście te dane są w pewien sposób
zamrożone i jeżeli coś się zmieni na bazie to
widok tego nie odzwierciedla dlatego jeżeli
chcemy zaktualizować taki zmaterializowany widok do
tego służy polecenie refresh materialized view trzeba
tylko podać nazwę widoku akurat widoki zmaterializowane w
pg adminie są wyświetlane w osobnym w osobnej grupie włączymy
sobie odświeżanie oznacza uruchomienie zapytania
które definiuje widok więc minuta prawie
dwie minuty oczywiście to trwa natomiast w przypadku widoków
zmaterializowanych wiadomo że dużo częściej będą odczytywane
niż odświeżane i jesteśmy w stanie poświęcić ten
czas na odświeżenie ważne jest że
odczyt jest dużo dużo szybszy oczywiście możemy używać
wykomentuję tutaj całą pierwszą linijkę możemy
możemy używać zmaterializowanego widoku zapytań sql i
dodawać do niego różne warunki filtrować i tak dalej filtrować
go i tak dalej na przykład w ten sposób
ponieważ filtry czy agregacje działają
już na wyciągniętych danych które są pewnie
pod zbiorem tych naszych wielkich danych dlatego też są
super szybkie w dodatku możemy jeszcze bardziej przyspieszać
odczyt z takiego widoku używając indeksów
na nim tak jak na tabeli o indeksach możesz się dowiedzieć więcej
w kursie zaawansowanym na razie tylko tyle że
przyspieszają one odczyt danych z tabeli albo
z właśnie z widoków zmaterializowanych
Tworzenie widoków zmaterializowanych · 5 min
-- Kwerenda wybierająca dane zgrupowane i przefiltrowane z dużej tablicy ('big_data')
SELECT count(big_number), array_agg(some_text), CAST(AVG(random_price) AS NUMERIC(10,2))
FROM big_data
GROUP BY big_number
HAVING AVG(random_price) > 300 AND COUNT(big_number) > 2;
-- Stworzenie widoku na bazie powyższej kwerendy
CREATE VIEW big_view AS (
SELECT count(big_number), array_agg(some_text), CAST(AVG(random_price) AS NUMERIC(10,2))
FROM big_data
GROUP BY big_number
HAVING AVG(random_price) > 300 AND COUNT(big_number) > 2
);
-- Wybranie danych z widoku (powinno potrwać parę sekund - przy kilkuset rekordach)
SELECT * FROM big_view;
-- Usuwamy widok 'big_view'
DROP VIEW big_view;
-- Po to aby stworzyć nowy, zmaterializowany widok
CREATE MATERIALIZED VIEW big_view AS (
SELECT count(big_number), array_agg(some_text), CAST(AVG(random_price) AS NUMERIC(10,2))
FROM big_data
GROUP BY big_number
HAVING AVG(random_price) > 300 AND COUNT(big_number) > 2
);
-- Odświeżenie widoku zmaterializowanego (aktualizacja danych)
REFRESH MATERIALIZED VIEW big_view;
-- Wybranie danych ze zmaterializowane widoku (dużo szybciej niż ze zwykłego)
SELECT * FROM big_view WHERE avg > 500;