Strona korzysta z plików cookies w celu realizacji usług i zgodnie z Polityką Plików Cookies.



25.10.2019

Skalowalna infrastruktura

Red Hat OpenStack Platform 15
25.10.2019

Cienki klient 2.0

Windows Virtual Desktop
25.10.2019

Nowy sprzęt Microsoftu

Rodzina Surface się powiększa
24.10.2019

Serwery ARM

Oracle stawia na Ampere Computing
24.10.2019

Wszechstronny i elegancki

Dell XPS 15
10.10.2019

CYBERSEC EXPO - największe w...

Bezpieczeństwo cyfrowe nie jest problemem dotyczącym jedynie działów IT. Obecnie stanowi...
30.09.2019

Nowości w wirtualizacji

VMware World 2019
30.09.2019

Bezpieczeństwo mobile-first

Android 10

Poprawiamy czytelność kodu

Data publikacji: 24-10-2019 Autor: Marcin Szeliga

Celem tej serii artykułów jest przedstawienie najlepszych praktyk programisty baz danych i skonfrontowanie ich z często spotykanymi złymi nawykami. Nieraz powodem tych drugich jest przenoszenie zasad obowiązujących w innych językach programowania do SQL-a. W pierwszej części artykułu dowiemy się, jak pisać czytelny, łatwy do utrzymania i rozwijania oraz poprawnie działający kod SQL.

 

Pierwszą wersję strukturalnego języka zapytań opracowała w latach 70. XX wieku firma IBM. Był to język SEQUEL (Structured English Query Language), który z czasem przekształcił się w SQL (Structured Query Language). Dziś, po 50 latach, język SQL wciąż jest jednym z najpopularniejszych języków programowania i najczęściej używanym językiem w pracy z danymi. Chociaż znajomość języka SQL pozostaje ogromnym atutem i jest ceniona na rynku pracy, coraz więcej programistów traktuje serwery baz danych jak czarne skrzynki. Brak wiedzy na temat modelu relacyjnego oraz budowy i działania serwerów baz danych prowadzi do pisania nieoptymalnych, tj. trudnych w utrzymaniu, nieskalowalnych, mało wydajnych, a nawet błędnie działających programów.

Język SQL jest wyjątkowy:

 

  • jest językiem deklaratywnym, czyli zamiast krok po kroku określać, jak serwer bazodanowy ma wykonać określone polecenie, użytkownik deklaruje, w języku przypominającym potoczny angielski, spodziewany wynik; SQL w przeciwieństwie do języków proceduralnych pozwala określić wynik, a nie sposób jego osiągnięcia;
  • serwery relacyjnych baz danych są w stanie w czasie rzeczywistym przetwarzać terabajty danych, o ile tylko zostaną użyte poprawne instrukcje języka SQL; możliwe jest to dzięki wyjątkowej cesze języka SQL – SQL w odróżnieniu od innych języków pozwala na przetwarzanie zbiorów (a więc wielu wartości) za pomocą pojedynczej instrukcji.


Chociaż Amerykański Narodowy Instytut Standardów (ANSI – American National Standards Institute) oraz Międzynarodowa Organizacja Normalizacyjna ISO (International Standard Organisation) od lat 90. XX wieku opracowują i publikują standardy języka SQL, zaimplementowane w różnych serwerach dialekty tego języka nieco się różnią. Ponadto standard ANSI nie obejmuje wewnętrznych mechanizmów wykonywania i optymalizacji instrukcji języka SQL przez serwery bazodanowe. Różnice między poszczególnymi serwerami są bardzo duże, a instrukcja, która wydajnie działa na jednym serwerze, może być nieoptymalnie wykonywana przez inny. Do ilustracji opisywanych zagadnień wybraliśmy serwer Microsoft SQL Server 2017 – jeden z najpopularniejszych i najwyżej ocenianych serwerów baz danych.

> ZAPISYWANIE INSTRUKCJI JĘZYKA SQL

Programy w każdym języku należy pisać w taki sposób, aby były czytelne dla nas i innych osób. Język SQL nie jest wyjątkiem od tej reguły.

Prostym sposobem poprawy czytelności kodu jest uzupełnienie go komentarzami. Zdefiniowanym w standardzie ANSI znakiem komentarza na poziomie wiersza są dwa myślniki (--). Kompilator ignoruje znaki znajdujące się po prawej stronie myślników. Tekst komentarza może też być wyróżniany za pomocą znaków /* */. Kompilator ignoruje wszystkie znaki znajdujące się między tymi znacznikami.

Serwery baz danych ignorują występujące w instrukcjach SQL znaki końca wiersza. Dla poprawy czytelności instrukcji przyjęło się zapisywać ich poszczególne klauzule w nowych wierszach. Natomiast koniec instrukcji oznacza się średnikiem. Chociaż kończenie instrukcji tym znakiem nie jest wymagane, jego brak może prowadzić do błędów w programach. Wynika to z tego, że niektóre słowa kluczowe języka SQL są wieloznaczne. Na przykład słowo WITH może oznaczać, w zależności od tego, czy zostało użyte na początku, czy na końcu zapytania, podzapytanie nazwane (CTE), deklarację schematu XML bądź dyrektywę optymalizatora. W rezultacie poniższa instrukcja działa poprawnie:

 

 

Ale po użyciu tej samej instrukcji w ciele procedury składowanej serwer zgłosi błąd (zabrakło średnika po instrukcji deklarującej zmienną @i):

 

 

Zobaczmy, do jak poważnych problemów może prowadzić niekończenie instrukcji SQL myślnikiem. Poniższa procedura wykonuje w ramach transakcji pewne operacje, tutaj symulowane dzieleniem. Jeśli podczas ich wykonania wystąpi błąd, transakcja powinna zostać wycofana, a oryginalny komunikat błędu zgłoszony klientowi.

 

 

Jednak wywołanie procedury z parametrem równym 0 pokazuje coś innego:

 

 

Dopiero dodanie średnika po instrukcji ROLLBACK TRANSACTION spowoduje, że procedura będzie działała prawidłowo.

 

[...]

 

Pracownik naukowy Wyższej Szkoły Bankowej w Poznaniu Wydział Zamiejscowy w Chorzowie; jest autorem książek poświęconych analizie danych i posiada tytuł Microsoft Most Valuable Professional. 

Pełna treść artykułu jest dostępna w papierowym wydaniu pisma.

prenumerata Numer niedostępny Spis treści

.

Transmisje online zapewnia: StreamOnline

All rights reserved © 2019 Presscom / Miesięcznik "IT Professional"