Bazy danych · Programowanie

Star Wars i bazy danych

 

Co mają wspólnego StarWars i bazy danych?

Jak to co? Walkę z gwiazd(k)ami 🙂


Reka do góry, kto kiedyś napisał takie zapytanie sql:

SELECT * FROM TABLE

Ja! Ja! Ja! Przyznaję się, popełniłam ten błąd nie raz.

Czemu to błąd? Ponieważ nie należy pobierać z bazy niepotrzebnych danych. Jeśli chcemy dowiedzieć się, jakie użytkownik ma imię i nazwisko, to po co nam informacja o dacie ostatniej modyfikacji lub o wieku? Niepotrzebna.


To teraz inne pytanie:

Kto wie, co to jest Query Execution Plan?

I znowu – ja! Ja! Ja!

Jest to taki wykres, który pokazuje jak sql przekształcił nasze zapytanie. W skrócie: proste zapytania mogą wyglądać tak:

simple_execution_plan.PNG

A te bardziej skomplikowane tak:

execution_pla.PNG

Warto popatrzeć na te wykresy i sprawdzić, czy przypadkiem nie można ich uprościć – może akurat odwołujemy się 2 razy do tej samej tabeli? Należy również pamiętać o tym, że używanie funkcji powoduje ukrycie prawdziwego przebiegu zapytania w Execution Plan. Wygląda on tak:

functionEP.png

Zamiast tak:

real_functionEP.png

Więcej na ten temat można poczytać .

Warto zwrócić uwagę również na widoki – czasami może się zdarzyć tak, że korzystając z nich w zapytania, przeszukujemy 2 razy tę samą tabelę.


Przejdźmy do ostatniego pytania na dziś:

Czy wierzycie we wszystko to, co zwraca Wam sql?

No a czemu nie?

Ano temu, że on się czasami myli. Przykład: chcemy policzyć liczbę wierszy w tabeli wykorzystując proste zapytanie:

SELECT COUNT(*) FROM TABLE

Co może pójść nie tak? Mogą być wykonywane operacje na tej tabeli. Nie chodzi nawet o dodawanie czy usuwanie wierszy. Niech to będzie jakiś update. Nawet on może spowodować, że nasz wynik będzie odbiegał od właściwej wartości. Czemu? Załóżmy, że robimy jakiś update indeksu na rekordzie, który zmienia jego miejsce w tabeli (np. przesuwa go z początku na koniec). Jest to operacja czasochłonna. W momencie liczenia liczby wierszy ten sam wiersz może być policzony 2 razy, a może w ogóle nie zostać policzony (ponieważ z obszaru, który jeszcze nie został odwiedzony przez Count zostanie przesunięty do obszaru, który już został odwiedzony). Może warto dodać jakieś ograniczenia dotyczące dozwolonych operacji na tabeli w trakcie wykonywania naszego zapytania? Odsyłam do informacji na temat .

PS 1 – powyższy tekst był zainspirowany panelem dyskusyjnym prowadzonym przez Grześka Stoleckiego podczas Modern Web Development (o którym pisałam tutaj).

PS 2 – więcej o Execution Plan można przeczytać u źródła początkowych zdjęć.

PS 3 – warto przejrzeć linki polecane przez Grześka:

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Wyloguj / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Wyloguj / Zmień )

Zdjęcie na Facebooku

Komentujesz korzystając z konta Facebook. Wyloguj / Zmień )

Zdjęcie na Google+

Komentujesz korzystając z konta Google+. Wyloguj / Zmień )

Connecting to %s