Bazy danych 12. SQL To i owo. Algorytmy złaczeń.



Podobne dokumenty
Bazy danych 11. Algorytmy złaczeń. P. F. Góra

Bazy danych 8. Złaczenia ciag dalszy. Grupowanie.

Bazy danych 5. Złaczenia. P. F. Góra

Bazy danych 7. Złaczenia

Bazy danych 2. Relacyjny model baz danych

Bazy danych 10. Uzupełnienia i przykłady

Bazy danych 8. Procedury składowane i kursory. P. F. Góra

Wykład 6. SQL praca z tabelami 3

Wykład 5. SQL praca z tabelami 2

Bazy danych 5. SQL- złaczenia, podzapytania i grupowanie

Wykład 8. SQL praca z tabelami 5

Bazy danych 10. SQL Widoki, procedury składowane, kursory i wyzwalacze

Bazy danych 7. SQL podstawy

Wykład 05 Bazy danych

Bazy danych 10. SQL Widoki

Relacyjne bazy danych. Podstawy SQL

Bazy danych 10. Widoki, procedury składowane, kursory i wyzwalacze. P. F. Góra

77. Modelowanie bazy danych rodzaje połączeń relacyjnych, pojęcie klucza obcego.

Modelowanie hierarchicznych struktur w relacyjnych bazach danych

Bazy danych. Bazy danych. Podstawy języka SQL. Dr inż. Paweł Kasprowski.

Relacyjne bazy danych. Podstawy SQL

Bazy danych 9. SQL Klucze obce Transakcje

Bazy danych 5. Samozłaczenie SQL podstawy

Bazy danych 6. Klucze obce. P. F. Góra

Aby uruchomić program klienta i połączyć się z serwerem, należy komendę:

Optymalizacja poleceń SQL Metody dostępu do danych

Język SQL, zajęcia nr 1

Kowalski Marcin Wrocław, dn Jaśkiewicz Kamil Bazy Danych 1 Podstawy Projekt Temat: Baza danych do zarządzania projektami

Wstęp 5 Rozdział 1. Podstawy relacyjnych baz danych 9

Bazy danych 6. Podzapytania i grupowanie. P. F. Góra

Bazy danych. Dr inż. Paweł Kasprowski

Bazy danych. dr inż. Arkadiusz Mirakowski

Składowane procedury i funkcje

Język SQL Złączenia. Laboratorium. Akademia Morska w Gdyni

Bazy Danych - Instrukcja do Ćwiczenia laboratoryjnego nr 8

Bazy danych. Wykład IV SQL - wprowadzenie. Copyrights by Arkadiusz Rzucidło 1

Bazy danych 12. SQL Wyszukiwanie pełnotekstowe

Konstruowanie Baz Danych SQL UNION, INTERSECT, EXCEPT

SQL 4 Structured Query Lenguage

Bazy danych 11. SQL Procedury składowane, kursory i wyzwalacze

Ćwiczenia laboratoryjne nr 11 Bazy danych i SQL.

Instytut Mechaniki i Inżynierii Obliczeniowej Wydział Mechaniczny Technologiczny Politechnika Śląska

Bazy Danych i Usługi Sieciowe

Pakiety podprogramów Dynamiczny SQL

Bazy danych i usługi sieciowe

Przykłady najlepiej wykonywać od razu na bazie i eksperymentować z nimi.

strukturalny język zapytań używany do tworzenia i modyfikowania baz danych oraz do umieszczania i pobierania danych z baz danych

Laboratorium nr 4. Temat: SQL część II. Polecenia DML

Bazy danych wykład dwunasty PL/SQL, c.d. Konrad Zdanowski ( Uniwersytet Kardynała Stefana Bazy danych Wyszyńskiego, wykładwarszawa)

DECLARE VARIABLE zmienna1 typ danych; BEGIN

Struktura drzewa w MySQL. Michał Tyszczenko

Autor: Joanna Karwowska

Integralność danych Wersje języka SQL Klauzula SELECT i JOIN

Bazy danych 4. SQL podstawy. P. F. Góra

Plan bazy: Kod zakładający bazę danych: DROP TABLE noclegi CASCADE; CREATE TABLE noclegi( id_noclegu SERIAL NOT NULL,

Bazy danych wykład dwunasty. dwunasty Wykonywanie i optymalizacja zapytań SQL 1 / 36

KOLEKCJE - to typy masowe,zawierające pewną liczbę jednorodnych elementów

Wykład 5 funkcje i procedury pamiętane widoki (perspektywy) wyzwalacze

Ref. 7 - Język SQL - polecenia DDL i DML

3. Podzapytania, łączenie tabel i zapytań

Indeksowanie w bazach danych

Przestrzenne bazy danych Podstawy języka SQL

E.14 Bazy Danych cz. 18 SQL Funkcje, procedury składowane i wyzwalacze

Bazy danych 9. Klucze obce Transakcje

Bazy danych 9. Klucze obce Transakcje. P. F. Góra

Programowanie w SQL procedury i funkcje. UWAGA: Proszę nie zapominać o prefiksowaniu nazw obiektów ciągiem [OLIMP\{nr indeksu}] Funkcje użytkownika

Tabela wewnętrzna - definicja

SQL Server i T-SQL w mgnieniu oka : opanuj język zapytań w 10 minut dziennie / Ben Forta. Gliwice, Spis treści

Informatyka sem. III studia inżynierskie Transport 2018/19 LAB 2. Lab Backup bazy danych. Tworzenie kopii (backup) bazy danych

SQL, LIKE, IN, CASE, EXISTS. Marcin Orchel

Wyzwalacze (triggery) Przykład

Bazy danych 8. Widoki i wyzwalacze. P. F. Góra

SQL (ang. Structured Query Language)

Wprowadzenie do baz danych

Bloki anonimowe w PL/SQL

Blaski i cienie wyzwalaczy w relacyjnych bazach danych. Mgr inż. Andrzej Ptasznik

BAZA DANYCH SIECI HOTELI

Instrukcja podwaja zarobki osób, których imiona zaczynają się P i dalsze litery alfabetu zakładamy, że takich osbób jest kilkanaście.

CREATE DATABASE ksiegarnia_internetowa DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

Autor: Joanna Karwowska

Bazy danych Język SQL część 2 Wykład dla studentów matem

Systemy GIS Tworzenie zapytań w bazach danych

PODSTAWY BAZ DANYCH 13. PL/SQL

P o d s t a w y j ę z y k a S Q L

SELECT * FROM tabela WHERE warunek wybiera dane spełniające podany warunek

koledzy, Jan, Nowak, ul. Niecała 8/23, , Wrocław, , ,

Aspekty aktywne baz danych

SQL/MySQL. Rafał Kern

Bazy danych 11. Kilka przykładów. P. F. Góra

Wybór EUROPEAN będzie rozpoznawał dzień przed miesiącem, natomiast US miesiąc przed dniem.

050 SQL ELEMENTY ZAAWANSOWANE. Prof. dr hab. Marek Wisła

Języki programowania wysokiego poziomu. PHP cz.4. Bazy danych

Podstawy języka SQL. SQL Structured Query Languagestrukturalny

Nowe technologie baz danych

SIECI KOMPUTEROWE I BAZY DANYCH

Instytut Mechaniki i Inżynierii Obliczeniowej fb.com/groups/bazydanychmt/

Zapytania, złączenia, optymalizacja zapytań, planowanie zapytań, optymalizacja indeksów.

Grupowanie i funkcje agregujące

Transkrypt:

Bazy danych 12. SQL To i owo. Algorytmy złaczeń. P. F. Góra http://th-www.if.uj.edu.pl/zfs/gora/ semestr letni 2005/06

I. SQL uzupełnienia Pełne złaczenie zewnętrzne Złaczenia typu LEFT JOIN i RIGHT JOIN łacz a te wiersze tabel, które maja swoje odpowiedniki, natomiast brakujace wiersze z jednej tabeli zostana w wyniku wypełnione wartościami NULL. Przypuśćmy jednak, że dwie tabele maja pewien wspólny zakres kluczy złaczenia, ale w obu sa klucze niepasujace do żadnego wiersza drugiej tabeli. Chcemy zobaczyć wszystko, co pasuje i wszystko, co nie pasuje, z obu tabel. W tej sytuacji trzeba użyć pełnego złaczenia zewnętrznego. 12. To i owo 2

Przykład mysql> SELECT * FROM chlopy; +------+--------+------+ Nr Imie Wiek +------+--------+------+ 1 John 24 2 Peter 28 3 Harry 31 4 George 17 5 John 21 6 Keith 30 9 Jerry 27 +------+--------+------+ 7 rows in set (0.00 sec) mysql> SELECT * FROM baby; +------+----------+------+ Nr Imie Wiek +------+----------+------+ 1 Betty 17 2 Ann 23 3 Susan 24 4 Joan 31 5 Margaret 29 6 Beth 30 7 Meredith 32 8 Scarlet 19 +------+----------+------+ 8 rows in set (0.09 sec) 12. To i owo 3

mysql> SELECT chlopy.nr AS Numer Faceta, chlopy.imie AS Facet, -> baby.imie AS Baba, baby.nr as "Numer Baby" FROM -> chlopy RIGHT JOIN baby on chlopy.nr=baby.nr -> UNION -> SELECT chlopy.nr AS Numer Faceta, chlopy.imie AS Facet, -> baby.imie AS Baba, baby.nr as "Numer Baby" FROM -> chlopy LEFT JOIN baby on chlopy.nr=baby.nr; +--------------+--------+----------+------------+ Numer Faceta Facet Baba Numer Baby +--------------+--------+----------+------------+ 1 John Betty 1 2 Peter Ann 2 3 Harry Susan 3 4 George Joan 4 5 John Margaret 5 6 Keith Beth 6 NULL Meredith 7 NULL Scarlet 8 9 Jerry NULL +--------------+--------+----------+------------+ 9 rows in set (0.05 sec) 12. To i owo 4

Polecenia PREPARE i EXECUTE Przypuśmy, że mamy kilka tabel o takiej samej strukturze, na przykład mysql> CREATE TABLE Kowalski -> (Data DATE NOT NULL, -> Miasto VARCHAR(16) NOT NULL, -> Kwota DECIMAL(8,2) UNSIGNED NOT NULL, -> PRIMARY KEY(Data, Miasto)); Query OK, 0 rows affected (1.10 sec) mysql> CREATE TABLE Nowak LIKE Kowalski; Query OK, 0 rows affected (0.16 sec) mysql> INSERT INTO Nowak VALUES (...); mysql> INSERT INTO Kowalski VALUES (...); 12. To i owo 5

Tabele Kowalski i Nowak maja taka sama strukturę, a więc, logicznie rzecz biorac, można ich użyć w takim samym zapytaniu w zapytaniu różniacym się tylko nazwa tabeli. Po stronie aplikacji zapytanie takie jest bardzo łatwo zbudować jako odpowiedni łańcuch, a następnie przesłać je do serwera SQL. Jednak traci się w ten sposób możliwość korzystania z procedur składowanych, a zatem wszystkie korzyści wynikajace z używania takich procedur. Pytanie: Czy w SQL nazwy tabel moga być parametrami procedur składowanych? Tak należy jednak wykorzystać polecenia PREPARE i EXECUTE. 12. To i owo 6

Procedura majaca nazwę tabeli jako argument CREATE PROCEDURE monthsales (IN nazwisko VARCHAR(16), IN miesiac TINYINT UNSIGNED) LANGUAGE SQL NOT DETERMINISTIC SQL SECURITY DEFINER BEGIN DECLARE EXIT HANDLER FOR 1146 BEGIN SELECT nazwisko AS "Nazwisko", "Nie ma takiej tabeli" AS "Brak tabeli"; END; /* tekst tworzonej komendy przechowuję _w_zmiennej_tymczasowej_! */ SET @tmp = CONCAT( SELECT ",nazwisko, " AS Nazwisko, SUM(KWOTA) FROM,nazwisko, WHERE MONTH(Data)=,miesiac, ; ); SELECT @tmp AS Wykonam następującą komendę ; /* utworzenie zapytania */ /* "komenda" jest >>handlerem<< utworzonego zapytania */ PREPARE komenda FROM @tmp; /* wykonanie utworzonego zapytania */ EXECUTE komenda; /* usunięcie >>handlera<< */ DEALLOCATE PREPARE komenda; END; 12. To i owo 7

mysql> CALL monthsales ( Kowalski,5); +------------------------------------------------------------------------------+ Wykonam następującą komendę +------------------------------------------------------------------------------+ SELECT "Kowalski" AS Nazwisko, SUM(KWOTA) FROM Kowalski WHERE MONTH(Data)=5; +------------------------------------------------------------------------------+ 1 row in set (0.00 sec) +----------+------------+ Nazwisko SUM(KWOTA) +----------+------------+ Kowalski 1741.30 +----------+------------+ 1 row in set (0.01 sec) Query OK, 0 rows affected (0.01 sec) 12. To i owo 8

mysql> CALL monthsales ( Nowak, 5); +------------------------------------------------------------------------+ Wykonam następującą komendę +------------------------------------------------------------------------+ SELECT "Nowak" AS Nazwisko, SUM(KWOTA) FROM Nowak WHERE MONTH(Data)=5; +------------------------------------------------------------------------+ 1 row in set (0.00 sec) +----------+------------+ Nazwisko SUM(KWOTA) +----------+------------+ Nowak 4404.51 +----------+------------+ 1 row in set (0.00 sec) Query OK, 0 rows affected (0.01 sec) 12. To i owo 9

mysql> CALL monthsales ( XYZ,4); +--------------------------------------------------------------------+ Wykonam następującą komendę +--------------------------------------------------------------------+ SELECT "XYZ" AS Nazwisko, SUM(KWOTA) FROM XYZ WHERE MONTH(Data)=4; +--------------------------------------------------------------------+ 1 row in set (0.00 sec) +----------+----------------------+ Nazwisko Brak tabeli +----------+----------------------+ XYZ Nie ma takiej tabeli +----------+----------------------+ 1 row in set (0.01 sec) Query OK, 0 rows affected (0.01 sec) 12. To i owo 10

II. Typy złaczeń SELECT... FROM T 1 JOIN T 2 ON T 1.k p =T 2.k q JOIN T 3 ON T 2.k r =T 3.k s WHERE...; SELECT... FROM T 1 JOIN T 2 ON T 1.k p =T 2.k q JOIN T 3 ON T 1.k r =T 3.k s WHERE...; Każdy wierzchołek grafu reprezentuje tabelę, każda krawędź złaczenie JOIN... ON... 12. To i owo 11

Tego typu złaczenia drzewiaste, mogace obejmować kilka, kilkanaście, kilkadziesiat lub nawet więcej tabel, sa charakterystyczne dla złaczeń, które obejmuja dane z wielu tabel, porozdzielane pomiędzy nimi głównie ze względów normalizacyjnych. W SQL daje się jednak realizować także złaczenia o innej strukturze, w szczególności złaczenia, w których pojawiaja się cykle. 12. To i owo 12

Zupełnie inny typ złaczenia Przypuśćmy, że mamy trzy tabele z takimi oto przykładowymi danymi: mysql> SELECT * FROM T1; +------+------+ I J +------+------+ 1 1 2 1 3 2 +------+------+ 3 rows in set (0.00 sec) mysql> SELECT * FROM T2; +------+------+ K L +------+------+ 1 A 2 B 3 C +------+------+ 3 rows in set (0.00 sec) mysql> SELECT * FROM T3; +------+------+ M N +------+------+ A 1 A 2 B 1 C 2 C 3 +------+------+ 5 rows in set (0.00 sec) 12. To i owo 13

Dla takich tabel można zaprojektować złaczenie zapętlone : mysql> SELECT Jeden.I AS I, Jeden.J AS J, K, L, M, N FROM T1 AS Jeden -> JOIN T2 ON Jeden.I=T2.K -> JOIN T3 ON T2.L=T3.M -> JOIN T1 As DWA ON T3.N=Dwa.J -> WHERE Jeden.I=Dwa.I AND Jeden.J=Dwa.J; +------+------+------+------+------+------+ I J K L M N +------+------+------+------+------+------+ 1 1 1 A A 1 2 1 2 B B 1 3 2 3 C C 2 +------+------+------+------+------+------+ 3 rows in set (0.00 sec) Ponieważ tabela T1 występuje w tym złaczeniu dwa razy, musi w każdym wystapieniu mieć unikalny alias. Warunek WHERE stanowi, że oba wystapienia tabeli T1 odnosza się do tych samych wierszy. 12. To i owo 14

Filtry Wyobraźmy sobie zapytanie SELECT... FROM T 1 JOIN T 2 ON... WHERE P(T 1 ) AND Q(T 2 ) AND R(T 1,T 2 ); Predykaty P i Q, działajace tylko na kolumnach tabel, odpowiednio, T 1 i T 2, sa filtrami, wybieraja bowiem pewne podzbiory wierszy tych tabel. Predykat R, działajacy na kolumnach obu tabel, można (i należy) traktować jako fragment warunku złaczenia (złaczenie theta). Im mniejszy procent wierszy wybiera z tabeli filtr, tym większa ma on selektywność. Dla efektywności złaczenia korzystne jest używanie filtru o największej selektywności możliwie najwcześniej. 12. To i owo 15

Jak baza danych realizuje złaczenia Złaczenia zdefiniowane sa jako podzbiory iloczynu kartezjańskiego odpowiednich tabel, jednak na ogół nie sa one realizowane w ten sposób, iż najpierw wykonywany jest iloczyn kartezjański, potem zaś wybierane sa odpowiednie wiersze. Sposób realizacji złaczenia nie może wpłynać na ostateczny wynik zapytania, ale może wpłynać (i wpływa!) na czas realizacji zapytania, zajętość pamięci itp. Jak zatem baza danych realizuje złaczenie? Najczęściej używa się następujacych trzech algorytmów: 12. To i owo 16

1. Złaczenie pętli zagnieżdżonych (nested loops) 1. Baza przeglada pierwsza tabelę wejściowa. Wiersze nie spełniajace filtru nałożonego tylko na ta tabelę odrzuca, wiersze spełniajace filtr przekazuje dalej. 2. Do każdego wiersza z pierwszej tabeli dopasowywane sa wiersze z drugiej tabeli, spełniajace warunek złaczenia (złaczenie wewnętrzne) lub wartości NULL, jeśli wierwszy takowych nie ma (złaczenie zewnętrzne). Odrzucane sa wiersze nie spełniajace warunków dla dotychczas wykorzystanych tabel, czyli filtru dla drugiej tabeli i warunków obejmujacych łacznie pierwsza i druga tabelę. 3. Analogicznie postępujemy dla trzeciej i każdej następnej tabeli. 12. To i owo 17

Takie złaczenie ma postać zagnieżdżonych pętli najbardziej zewnętrzna o- biega pierwsza tabelę wejściowa, najbardziej wewnętrzna ostatnia. Z tego względu istotne jest, aby pierwsza, najbardziej zewnętrzna pętla, odrzucała możliwie dużo wierszy oraz żeby połaczenia następowały po kolumnach indeksowanych, wówczas bowiem łatwo jest znaleźć wiersze pasujace do aktualnego klucza złaczenia. Na każdym etapie wymagana jest jedynie informacja o aktualnie przetwarzanej pozycji oraz zawartość konstruowanego w danej chwili wiersza wynikowego cały proces nie wymaga dużej pamięci. Złaczenie pętli zagnieżdżonych może mieć warunki złaczenia w postaci nierówności. Wiele RDBMS wyraźnie preferuje ten typ złaczenia. 12. To i owo 18

2. Złaczenie haszujace (mieszajace, hash join) Stosuje się tylko do złaczeń wewnętrznych, w których warunki złaczenia maja postać równości. Teoretycznie jest to wówczas najszybszy algorytm złaczenia, ale praktycznie tak wcale nie musi być. Złaczane tabele przetwarzane sa niezależnie. Cały algorytm przebiega w dwu fazach: W fazie budowania dla mniejszej (po zastosowaniu filtru) tabeli tworzona jest tablica haszujaca (tablica mieszajaca, hash table), powstała przez zastosowanie funkcji haszujacej do kluczy złaczenia. Teoretycznie rozmieszcza on hasze przyporzadkowane różnym kluczom równomiernie w pamięci. Algorytm działa szczególnie szybko, jeśli cała tablica haszujaca mieści się w pamięci. 12. To i owo 19

W fazie wyszukiwania sekwencyjnie przegladana jest większa tabela. Na kluczu złaczenia każdego wiersza wykonywana jest ta sama funkcja haszujaca; jeżeli odpowiedni element znajduje się w tablicy haszujacej dla pierwszej tabeli, wiersze sa łaczone. Jeżeli nie, wiersz drugiej tabeli jest odrzucany. Jeżeli tablica haszujaca znajduje się w całości w pamięci, średni czas wyszukiwania elementów jest stały i niezależny od rozmiarów tablicy to właśnie stanowi o efektywności tego algorytmu. 12. To i owo 20

Problemy ze złaczeniem haszujacym Efektywność złaczenia haszujacego silnie zależy od doboru funkcji haszujacej. Idealna funkcja haszujaca ma tę własność, że zmiana pojedynczego bitu w kluczu, zmienia połowę bitów hasza, i zmiana ta jest niezależna od zmian spowodowanych przez zmianę dowolnego innego bitu w kluczu. Idealne funkcje haszujace sa trudne do zaprojektowania lub kosztowne obliczeniowo, stosuje się więc funkcje gorsze, co jednak prowadzić może do kolizji: Fukncja haszujaca dwóm różnym kluczom usiłuje przypisać tę sama wartość hasza. Aby tego uniknać, stosuje się różne techniki, co jednak powiększa koszt obliczeniowy algorytmu. Innym problemem jest grupowanie: Wbrew założeniom, funkcje haszujace maja tendencję do nierównomiernego rozmieszczania haszy w pamięci, co zmniejsza efektywnośc wykorzystania pamięci i powiększa czas wyszukiwania. 12. To i owo 21

3. Złaczenie sortujaco-scalaj ace (sort and merge) Tabele odczytuje się niezależnie i stosuje do nich właściwe filtry, po czym wynikowe zbiory wierszy sortuje się względem klucza złaczenia. Następnie dwie posortowane listy zostaja scalone. Baza danych odczytuje na przemian wiersze z każdej listy. Jeżeli warunek złaczenia ma postać równości, baza porównuje górne wiersze i odrzuca te, które znajduja się na posortowanej liście wcześniej niż górny wiersz drugiej tabeli, zwraca zaś te, które wzajemnie sobie odpowiadaja. Procedura scalania jest szybka, ale procedura wstępnego sortowania jest wolna, o ile nie ma gwarancji, że oba zbiory wierszy mieszcza się w pamięci. 12. To i owo 22

Uwaga! Jeżeli ze względów estetycznych lub innych wynikowy zbiór wierszy pewnego zapytania ma być posortowany, to jeśli ten wynikowy zbiór w całości nie mieści się w pamięci, może to znacznie spowolnić czas wykonywania zapytania. 12. To i owo 23

Wymuszanie kolejności wykonywania złaczeń Przypuśćmy, że łaczymy więcej niż dwie tabele i że warunek złaczenia ma postać... AND T 1.k 2 =T 2.k 2 AND T 1.k 3 =T 3.k 3... Chcemy wykonać pętle zagnieżdżone po tabelach T 1 i T 2 przed odwołaniem do tabeli T 3. Aby odroczyć wykonanie złaczenia, trzeba uczynić je zależnym od danych ze złaczenia, które powinno zostać wykonane wcześniej. 12. To i owo 24

... AND T 1.k 2 =T 2.k 2 AND T 1.k 3 +0*T 2.k 2 =T 3.k 3... Druga wersja jest logicznie równoważna pierwszej, jednak baza interpretujac je, po lewej stronie drugiego złaczenia trafia na wyrażenie, które zależy tak od tabeli T 1, jak i T 2 (nie ma znaczenia, że wartość z tabeli T 2 nie może wpłynać na wynik), nie wykona więc złaczenia z T 3 przed złaczeniem z T 2. Uwaga: Oczywiście to samo stosuje się do złaczeń sformułowanych w postaci... T 1 JOIN T 2 ON T 1.k 2 =T 2.k 2 JOIN T 3 ON T 1.k 3 =T 3.k 3... 12. To i owo 25