SQL_BLOG#31

10 dobrych praktyk w pisaniu zapytań SQL

Czy zdarzyło Ci się, że Twoje zapytania zajmowały dużo czasu, choć na pozór nie powinny? Często zwracamy uwagę na to jak pracuje nasza baza danych przy odpytywaniu jednak nie zważamy na obciążenie jakie generujemy. Zdarzyło mi się niejednokrotnie, że dział IT zgłosił się do mnie z zapytaniem czemu tak mocno obciążam bazę danych i czy dane, które pobierałem były, aby na pewno potrzebne.

W dzisiejszym wpisie znajdziesz kilka punktów, które pomogą Ci tworzyć zapytania bardziej zoptymalizowane. Zyskasz dzięki temu:

  • lepszą przejrzystość kodu,
  • zmniejszone obciążenie serwera, a więc i czas.

#1 Staraj się nie używać SELECT * w swoich zapytaniach

Zamiast * staraj się wybierać konkretne kolumny ze zbioru, które są Ci potrzebne. Bardzo rzadko potrzebujemy pobierać wszystkie kolumny, a wypisując je kolejno wewnątrz kodu innym użytkownikom łatwiej będzie zaznajomić się z naszym zapytaniem.

#2 Unikaj funkcji DISTINCT

Składnia SELECT DISTINCT najczęściej jest używana po to, aby wybrać unikatowe rekordy z bazy danych. Zamiast wybierać funkcję distinct przemyśl wybranie kilku kolumn, które doprowadzą do utworzenia unikatowych wartości.

#3 Staraj się nie używać UNION na dużych tabelach

Funkcja UNION ALL łączy ze sobą dwie tabele. Zamiast tego wypróbuj funkcję UNION, która nie dość, że połączy Twoje dane, to także usunie duplikaty powstałe w wyniku połączenia dwóch tabel.

#4 Używaj JOIN’ów zamiast łączyć tabele funkcją WHERE

Prawie wszystkie rodzaje baz danych obsługują funkcję JOIN. Większość baz danych tworzy tymczasową tabelę, gdy użyjemy funkcji WHERE, aby połączyć dane, co dodatkowo obciąża nasz serwer.

#5 Do filtrowania nieagregowalnych kolumn używaj funkcji WHERE zamiast HAVING

Korzystanie z funkcji HAVING wymaga od nas zgrupowania danych, co jest dodatkowym krokiem, jaki serwer musi wykonać, aby przetworzyć nasze zapytanie. Funkcja WHERE natomiast pozwala filtrować nieagregowalne kolumny bez dodatkowego grupowania.

#6 Staraj się nie używać znaków specjalnych na początku wyrażenia (Wildcards)

Wyszukiwanie np. ‘%abc%’ powoduje, iż serwer skanuje całą tabelę w poszukiwaniu zgodnego łańcucha tekstu, ponieważ jest ono z góry poprawne (tj. każdy wiersz może zaczynać się dowolnym znakiem. Zamiast tego spróbuj wykorzystać w swoim zapytaniu ‘abc%’.

#7 Nie używaj funkcji po lewej stronie operatora podczas filtrowania WHERE

Filtrowanie kolumny określonej funkcją jest kosztowne dla zasobów serwera. Jeśli nałożymy funkcję na kolumnę, serwer nie będzie korzystał z indexu nałożonego na nią. Lepiej jest filtrować kolumnę za pomocą funkcji po prawej stronie operatora, np.

ŹLE:

WHERE

TO_CHAR(data_sprzedazy, ‘YYYYMMDD’) = ‘20200703’

DOBRZE:

WHERE

Data_sprzedazy = CAST(‘20200703′ as date)

#8 Unikaj łączenia kolumn wewnątrz zapytania WHERE

Staraj się nie używać funkcji CONCATENATE na dwóch kolumnach, aby utworzyć klucz filtrowania. Zamiast tego wypisz dwa warunki w funkcji WHERE, np.

WHERE

Filtr1=x

AND filtr2=y

#9 Staraj się nie wykorzystywać kalkulowanych pól w filtrach WHERE i JOINach

Nie powinno się używać kalkulacji na polach, które są przedmiotem filtrów lub joinów. Staraj się filtrować i łączyć konkretne kolumny. Łączenie na podstawie kalkulowanych pól pochłania wiele zasobów serwera (każdy rekord w tabeli musi zostać przekalkulowany i sprawdzony pod kątem możliwości filtru/połączenia).

#10 Rozważ odpowiednią kolejność w zapytaniu GROUP BY

Twoje zapytanie GROUP BY może być nieco szybsze jeśli ułożysz kolumny w odpowiedniej kolejności grupowania.

Interesujący artykuł? Podaj dalej!