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


23.06.2020

PLNOG Online

PLNOG Online
23.06.2020

Nowe zagrożenie

Ramsay
23.06.2020

Chmurowe kopie

Veeam Backup dla Microsoft Azure
19.06.2020

Nowości w kontenerach

Red Hat OpenShift 4.4
19.06.2020

Analityka bezpieczeństwa

FortiAI
19.06.2020

UPS dla obliczeń edge

Schneider APC Smart-UPS
16.06.2020

Przemysłowe SD

Nowe karty Transcend
16.06.2020

Storage dla SMB

QNAP TS-451DeU
16.06.2020

Pamięć masowa

Dell EMC PowerStore

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. 

Artykuł pochodzi z miesięcznika: IT Professional

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

.

Transmisje online zapewnia: StreamOnline

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