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


26.10.2020

Nowa wersja nVision

Można już pobierać nową wersję nVision
26.10.2020

Monitorowanie infrastruktury

Vertiv Environet Alert
23.10.2020

Telefonia w chmurze

NFON Cloudya
23.10.2020

Nowości w EDR

Bitdefender GravityZone
23.10.2020

Wykrywanie anomalii

Flowmon ADS11
23.10.2020

Mobilny monitor

AOC 16T2
22.10.2020

HP Pavilion

HP zaprezentowało nowe laptopy z linii Pavilion.
22.10.2020

Inteligentny monitoring

WD Purple SC QD101
22.10.2020

Przełącznik 2,5GbE

QNAP QSW-1105-5T

Przetwarzamy zbiory, a nie listy bądź pojedyncze wartości

Data publikacji: 25-11-2019 Autor: Marcin Szeliga
Rys. 1. Atrybut Ordered równy...

W pierwszej części poradnika poznaliśmy wyjątkowe cechy języka SQL oraz nauczyliśmy się pisać czytelne i poprawnie działające zapytania. Lektura drugiej części pomoże nam lepiej zrozumieć konsekwencje obowiązującego w bazach danych paradygmatu, mówiącego, że tabele reprezentują zbiory, a język SQL został stworzony z myślą o efektywnym przetwarzaniu zbiorów danych.

 

Podstawowym obiektem relacyjnych baz danych jest tabela – dwuwymiarowa struktura zbudowana z pionowych kolumn i poziomych wierszy, na których przecięciu znajdują się komórki. Niezbędna dla opanowania języka SQL jest umiejętność wyobrażenia sobie tabel jako zbiorów.

Po pierwsze, tabele, tak jak zbiory, mogą zawierać zero lub więcej elementów. Elementami tabel są wiersze, czyli wektory o niezerowej długości. Warto zauważyć, że zbiory nie zawierają kilku kopii tego samego elementu. Przykładowo zbiór liczb całkowitych zawiera tylko jedną liczbę 1 i jedną liczbę 2, a zbiór kolorów – tylko jeden element o nazwie „niebieski”. Natomiast w tabeli może się wielokrotnie powtórzyć ten sam wiersz, np. w wyniku przypadkowego ponownego wpisania danych tej samej osoby. Ponieważ powtórzenie tego samego rekordu prowadzi do trudno wykrywalnych błędów, przyjęło się dodawać do tabeli specjalną kolumnę (lub kolumny), w której zapisuje się unikatowe identyfikatory poszczególnych wierszy. Taką kolumnę nazywa się kluczem podstawowym tabeli.

Po drugie, skoro kolejność elementów zbioru jest nieistotna, to kolejność wierszy tabeli, o ile nie zostanie ona jawnie określona w zapytaniu, nie będzie miała znaczenia dla serwerów baz danych. Serwery bazodanowe odczytują i modyfikują poszczególne wiersze tabel w taki sposób, żeby zminimalizować koszt wykonywanych operacji (dzięki czemu odczytanie lub zmodyfikowanie danych jest szybsze), nie przejmując się przy tym kolejnością, w jakiej wiersze zostały wstawione do tabel.

> POJEDYNCZE INSTRUKCJE JĘZYKA SQL

Język SQL został stworzony z myślą o przetwarzaniu zbiorów – pojedyncza instrukcja tego języka może odczytać lub zmodyfikować dowolny zbiór danych. Tymczasem języki proceduralne, takie jak C i Pascal, oraz obiektowe, takie jak Java i C#, przyzwyczaiły programistów do konieczności przetwarzania danych różnych typów jedna po drugiej przy użyciu jawnie lub niejawnie zdefiniowanych pętli.

Przyjrzyjmy się tej różnicy na prostym przykładzie. Naszym zadaniem jest zapisanie w tabeli tymczasowej numerów produktów oraz liczby dni, które upłynęły między datą ich zamówienia a wyprodukowania. Informacje o produktach znajdują się w tabeli Production.Product, a o zamówieniach w powiązanej z nią tabeli Production.WorkOrder. Rozwiązanie zadania sprowadza się do złączenia obu tabel, obliczenia dla otrzymanych w ten sposób wierszy różnicy w dniach między datą złożenia zamówienia a datą jego realizacji i zapisania nazwy produktów oraz wyliczonej różnicy w dniach do tabeli tymczasowej. Dodatkowo zmierzymy czas wykonania tej instrukcji i policzymy liczbę wstawionych do tabeli tymczasowej wierszy. Poniższe instrukcje uruchomiliśmy dwukrotnie, żeby mieć pewność, że za drugim razem wszystkie potrzebne do ich wykonania dane były już zbuforowane w pamięci. W ten sposób wyeliminowaliśmy wpływ chwilowej wydajności dysków na czas wykonania zapytania, co umożliwi nam wiarygodne porównywanie wydajności różnych rozwiązań.

 

 

Takie rozwiązanie problemu pozwoliło domowemu serwerowi baz danych przetworzyć 72 591 wierszy w 46 ms, czyli z wydajnością prawie 1600 wierszy na milisekundę.

 

> PĘTLE

Programiści przyzwyczajeni do przetwarzania wartości skalarnych mogliby rozwiązać to samo zadanie, używając pętli. W ten sposób, wbrew założeniom języka SQL, nie definiują oni spodziewanego wyniku, ale określają sposób jego otrzymania. Używanie języka wbrew jego założeniom prowadzi do licznych problemów i z reguły wymaga napisania dłuższego kodu.

Najpierw musimy utworzyć zmienne, w których zapiszemy identyfikatory produktów oraz daty złożenia i zrealizowania zamówień. Następnie w pętli odczytamy kolejne identyfikatory zamówień i na ich podstawie wybierzemy identyfikator zamówionego produktu. Na końcu odczytamy dane produktu o tym identyfikatorze, policzymy liczbę dni, które upłynęły między datą jego zamówienia a wyprodukowania, i wstawimy numery produktów oraz otrzymaną różnicę w dniach do tabeli tymczasowej.

Poniższe rozwiązanie również uruchomiliśmy dwukrotnie, za drugim razem czas jego wykonania przekroczył 3,5 sekundy.

 

 

 

Chociaż liczba przetworzonych wierszy się nie zmieniła, to wydajność serwera baz danych spadła prawie 80-krotnie. Użycie pętli spowodowało, że ten sam serwer baz danych przetwarzał tylko 20 wierszy na milisekundę.

> KURSORY

Serwery baz danych zostały zbudowane z myślą o wydajnym przetwarzaniu dużych zbiorów danych, dlatego z reguły nie przetwarzają one pojedynczych wierszy, ale ich bloki o określonej wielkości, np. 8 KB. To pierwszy powód, dla którego pętle są wykonywane przez serwery baz danych tak wolno – zmuszając serwer do odczytywania pojedynczych wierszy, wielokrotnie odczytujemy te same bloki danych. Problem ten może być jeszcze poważniejszy, jeżeli te same bloki danych będą musiały być wielokrotnie odczytywane z dysków.

 

[...]

 

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"