IBM DB2 cechy warte odnotowania v v v v v v Różne typy tabel w tym MDC - wielowymiarowe Podział jednej bazy danych na niezależne partycje nie tylko pojedynczej tabeli Łączenie pokrewnych instrukcji w jedną w celu zwiększenia wydajności Nadtabela i jej podtabele - oprócz typów i podtypów Możliwość przekazywania z procedury zbiorów wynikowych wierszy poprzez otwarte kursory również do aplikacji Autoryzacja przyznanym poziomem dostępu do tabel, kolumn i wierszy Label Based Access Control (LBAC) 1/125
Bibliografia Przygotowane w oparciu o: materiały szkoleniowe używane przez Artura Wrońskiego (IBM) i E. Mrówkę-Matejewską; Graeme Birchall, DB@ UDB V8.2 SQL Cookbook - dostępna w Internecie i w katalogu z prezentacją; materiały edukacyjne firmy IBM: DB2 v9 Fundamentals, DB2 SQL Workshop, DB2 SQLWorkshop for Experienced Users, DB2 v9 Admin Workshop for Windows, DB2 v8 Stored Procedures Programming Workshop dostępne w katalogu z prezentacją Dokumentacja: http://publib.boulder.ibm.com/infocenter/db2luw/v9/index.jsp Raul F.Chong,.. Zrozumieć DB2, IBM Press, Mikom, PWN 2006. 2/125
DB2 Editions M assively P arallel P rocessor (M PP ) DB2 C luster E nterprise S erver E dition w ith D ata P artitioning Feature E nterprise S erver E dition W orkgroup S erver E dition E xpress E dition Express: wersja darmowa wsparcie techniczne na Forum internetowym. 3/125
Instancja (database manager) - niezależne środowisko do pracy z bazami danych - dwie instancje na tym samym komputerze nie współużytkują żadnych zasobów (parametrów, plików). Serwer administracyjny udostępnia usługi zdalnej administracji i harmonogramowania zleceń (np. wykonanie skryptu SQL o określonej godzinie). Serwer administracyjny ma własną konfigurację i własną narzędziową bazę danych (tools database). 4/125
Control Center Object Tree Pane Contents Pane Object Detail Pane 5/125
Hierarchia obiektów DB2 Instance=Database Manager Instance 1 dbm configuration file SYSCATSPACE SYSCATSPACE Catalog Catalog Log DB configuration file Database 1 View1 View2 Log DB configuration file Database 2 View1 TSSMS1 TSDMSLRG1 USERSPACE1 Table1 Table2 Table3 Table1 Index1 TSDMSLRG3 BLOBs TSDMSREG2 Index1 Index2 Przy tworzeniu bazy danych domyślnie są tworzone trzy przestrzenie tabel: SYSCATSPACE, TEMPSPACE1, USERSPACE1 6/125
Struktura przestrzeni tabel Kontener miejsce, gdzie przechowywane są dane np. katalog, plik, dysk (raw device). 7/125
Przestrzeń tabel zarządzana przez system operacyjny (SMS) CREATE TABLESPACE nazwa MANAGED BY SYSTEM USING ('path') Dodatkowe miejsce na dysku jest alokowane w miarę potrzeb dane mogą być rozrzucone po całym dysku (większa fragmentacja). Wymagają mniejszego zaangażowania DBA w zarządzanie. 8/125
Przestrzeń tabel zarządzana przez DBA (DMS) CREATE TABLESPACE nazwa MANAGED BY DATABASE USING (FILE 'path' size) Składa się z kontenerów, które mogą być: plikami o z góry ustalonym rozmiarze, założonych przez DBA w momencie tworzenia przestrzeni tabel, jest dla nich od razu alokowana przestrzeń na dysku, co oznacza, że zwykle znajdują się w spójnym obszarze na dysku. Oznacza to mniej operacji R/W. dyskami (RAW devices) - system ma do dyspozycji spójny obszar całego dysku. Aby powiększyć rozmiar przestrzeni tabel, administrator musi dołożyć kolejny kontener albo rozszerzyć istniejący. Dane LOB mogą być składowane w osobnej przestrzeni tabel. 9/125
Typy przestrzeni tabel v v v Regular - do przechowywania tabel, indeksów i tabel katalogu systemowego. Temporary - używane przez operacje, które wymagają dodatkowego miejsca na dysku: sortowanie, złączenia tabel, reorganizacja tabel. Long - do przechowywania danych typu LOB. 10/125
Strony danych i ekstenty Domyślnie strona danych w bazie DB2 ma wielkość 4 KB (można ustawić też wielkość 8, 16 i 32 KB podczas tworzenia bazy danych). Każda strona (niezależnie od wielkości) zawiera nagłówek o stałej wielkości 76 bajtów. Wiersz danych nie może być dzielony między różne strony danych. Rozmiar ekstentu może mieć różną wielkość (ustawioną przez DBA podczas tworzenia przestrzeni tabel) - równy wielokrotności rozmiaru strony danych. Dane typu Long Field (long varchar i long vargraphic) przechowywane są w segmentach po 32 KB a dane LOB w segmentach po 64 MB. 11/125
Wstawianie danych Miejsce na nowe dane jest alokowane we wszystkich kontenerach przestrzeni tabel wg algorytmu round-robin - dane w każdej przestrzeni tabel są równo rozłożone między kontenery. W momencie dołożenia kontenera do przestrzeni tabel jest wykonywana reorganizacja danych tak, aby uzyskać równomiernie rozłożenie danych w kontenerach. Kontenery powinny mieć jednakowy rozmiar, aby były równomiernie zapełniane i żeby miejsce w jednym z nich nie skończyło się szybciej niż w innych. 12/125
Przypisanie puli buforów danych do przestrzeni tabel Domyślna pula buforów: ibmdefaultbp ALTER BUFFERPOOL ibmdefaultbp IMMEDIATE SIZE 1000; CREATE BUFFERPOOL databp IMMEDIATE SIZE 10000 PAGESIZE 8K; ALTER TABLESPACE userspace1 BUFFERPOOL databp; 13/125
Struktura bazy danych 14/125
Partycja bazy danych Partycja bazy danych (węzeł bazodanowy, database partition) - część bazy danych składającą się z własnych danych, indeksów, plików konfiguracyjnych i dzienników transakcji. Oprócz tego są partycje tabeli jak w Oracle i MS SQL Server. 15/125
Tabela na poziomie fizycznym Obiekt tabeli składa się z osobnych podobiektów: Obiekt danych - zawierający zwykłe dane tabeli. Obiekt indeksów zawierający wszystkie indeksy założone na tabeli. Obiekt dla pól typu LONG zawierający zawartość wszystkich pól typu LONG. - Pierwszy obiekt dla pól typu LOB zawierający wszystkie dane LOB. - Drugi obiekt dla pól typu LOB zawierający metadane dla wszystkich danych LOB. 16/125
Bitmapy ekstentów Bitmapy: 1. alokowanych/wolnych ekstentów w pliku, 2. opisujące ekstenty używane przez daną tabelę. 17/125
Typy tabel 1. Regular implementowane jako sterta (heap). 2. Append typ regular zoptymalizowany dla operacji INSERT i wyszukiwania (z typu regular zmiana przez ALTER TABLE). 3. Multidimensional clustering (MDC) grupowane według kilku kluczy (nazywanych wymiarami) dla zastosowań OLAP. 4. Range-clustered (RCT) grupowane liniowo względem wartości jednoznacznego klucza (wartość klucza określa adres) z określonego przedziału wartości, z góry alokowany obszar dla rekordów. Możliwy obszar nadmiarowy dla kluczy spoza określonego przedziału. Oprócz tego niezależnie są indeksy pogrupowane. 5. Partycjonowane 18/125
Składowanie tabeli MDC jako zbioru komórek z dostępem przez indeksy blokowe Komórka (pojęcie logiczne) zbiór rekordów z tym samym układem wartości wymiarów. Indeks blokowy osobno dla każdego wymiaru. Alternatywa dla indeksów bitmapowych. 19/125
Zbiór komórek - każda składająca się ze zbioru bloków Komórka składa się z bloków stron rekordów (rozmiaru ekstentów) zapisywanych obok siebie na dysku. 20/125
Złożony indeks blokowy Umożliwiający znajdowanie bloków dla kombinacji wartości wymiarów. Uporządkowanie leksykograficzne 21/125
Tabela zorganizowana według wymiarów (MDC table) CREATE TABLE Sales ( sales_person VARCHAR(30) NOT NULL, region CHAR(5) NOT NULL, number_of_sales INT NOT NULL, year INT) ORGANIZE BY DIMENSIONS (sales_person, year); 22/125
SQL 23/125
Schemat Instancja serwera składa się z baz danych. Każda baza danych składa się ze schematów, w tym jeden schemat tworzony automatycznie o nazwie identycznej z identyfikatorem autoryzacji właściciela bazy danych. Jest to domyślny (bieżący) schemat w bazie danych. CREATE SCHEMA MySchema; Nazwa kwalifikowana obiektu w bazie danych: schemat.obiekt CREATE TABLE Tab1 (kol int); Tworzona w schemacie userid czyli userid.tab1 CREATE TABLE MySchema.Tab1 (kol int); Tworzona w schemacie MySchema czyli MySchema.Tab1 24/125
Usunięcie schematu DROP SCHEMA nazwa RESTRICT; Możliwe tylko wtedy, gdy schemat jest pusty nie zawiera obiektów (słowo RESTRICT wymagane). 25/125
Zmiana bieżącego schematu VALUES CURRENT SCHEMA; SET CURRENT SCHEMA db2admin; CREATE TABLE tab1 ( ); -- bieżący sch. CREATE TABLE schema1.tab1 ( ); -- jawny schem. SET CURRENT SCHEMA USER; 26/125
VALUES Wynikiem tabela o wartościach określonych przez wartości wyrażeń. Przykłady: VALUES (1, 2, 3) - 1 wiersz o 3 kolumnach VALUES (1,21),(2,22),(3,23) - 3 wiersze każdy o 2 kolumnach VALUES CURRENT DATE 1 wiersz z jedną kolumną 27/125
28/125
EMPLOYEE (lub STAFF) CREATE TABLE EMPLOYEE (EMPNO CHARACTER(6) PRIMARY KEY,FIRSTNME VARCHAR(12) NOT NULL,MIDINIT CHARACTER(1),LASTNAME VARCHAR(15) NOT NULL,WORKDEPT CHARACTER(3),PHONENO CHARACTER(4),HIREDATE DATE,JOB CHARACTER(8),EDLEVEL SMALLINT NOT NULL,SEX CHARACTER(1),BIRTHDATE DATE,SALARY DECIMAL(9,2),BONUS DECIMAL(9,2),COMM DECIMAL(9,2)) IN USERSPACE1; 29/125
DEPARTMENT (lub DEPT) CREATE TABLE DEPARTMENT (DEPTNUMB SMALLINT NOT NULL,DEPTNAME VARCHAR(14),MANAGER SMALLINT,DIVISION VARCHAR(10),LOCATION VARCHAR(13)) IN USERSPACE1; 30/125
Tabele CREATE TABLE tab1 (id INT); CREATE TABLE tab2 LIKE tab1; CREATE TABLE tab3 AS (SELECT * FROM tab1) ; DESCRIBE TABLE tab1; 31/125
Typy danych SMALLINT, INT, BIGINT REAL, DOUBLE, DECIMAL(n,m) CHAR(n), VARCHAR(n), LONG VARCHAR, CLOB(n) GRAPHIC,VARGRAPHIC,LONG VARGRAPHIC, DBCLOB(n) BLOB(n) DATE, TIME, TIMESTAMP DATALINK obiekt zawierający link (URL) do zewnętrznego obiektu (atrybuty: link type, data location, comment) XML 32/125
Konwersje typów Operacje na niekompatybilnych typach danych wymagają jawnej konwersji, np: CHAR <-> NUMERIC - Przykład jawnej konwersji CAST(col1 as DECIMAL(4,2)) DECIMAL(col1,4,2) - Metoda na sprawdzenie typów zapytania DESCRIBE OUTPUT (SELECT SUM(col1) FROM tab2); 33/125
Kolumna IDENTITY CREATE TABLE invoice_data (invoice# INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY,. PRIMARY KEY (invoice#)); GENERATED ALWAYS zawsze generowany przez System (opcja domyślna), GENERATED BY DEFAULT generowane przez System gdy użytkownik nie załączy wartości. Ostatnio wygenerowana wartość: IDENTITY_VAL_LOCAL() Generowane przed wyzwalaczem BEFORE. Możliwe parametry: AS IDENTITY (START WITH 100 INCREMENT BY 10) 34/125
Wstawianie do tabeli z IDENTITY INSERT INTO customers(name, address) VALUES ( FRED, xxx ); -- lub INSERT INTO customers VALUES (DEFAULT, FRED, xxx ); Jedna operacja: Wstaw i wyświetl SELECT MIN(cust#) AS minc, WYNIK MAX(cust#) AS maxc, ============== COUNT(*) AS rows MINC MAXC ROWS FROM FINAL TABLE ----------------- ---- ---- (INSERT INTO customers 3 5 3 VALUES (DEFAULT,'FRED','xxx'), (DEFAULT,'DAVE','yyy'), (DEFAULT,'JOHN','zzz')); Połączenie dwóch instrukcji w jedną zwiększenie wydajności. 35/125
Sekwencje CREATE SEQUENCE seq1 AS BIGINT [START WITH 1 INCREMENT BY 1 NO MAXVALUE NO CYCLE CACHE 24]; CACHE czy generować wartości sekwencji blokami VALUES NEXTVAL FOR seq1 ; VALUES PREVVAL FOR seq1 ; VALUES PREVVAL FOR seq1 INTO :host-var; ALTER SEQUENCE seq1 RESTART WITH 100; 36/125
Przykład CREATE SEQUENCE fred; SEQ# -------- 1 WITH temp1 (n1) AS 2 VALUES ( a ),( b ),( c ),( d ),( e ) 3 SELECT NEXTVAL FOR fred AS seq# 4 FROM temp1; 5 37/125
Globalna stała za pomocą sekwencji CREATE SEQUENCE biggest_sale_to_date AS INTEGER START WITH 345678 INCREMENT BY 0; Przechowywana w katalogu systemowym. 38/125
Tymczasowa globalna tabela DECLARE GLOBAL TEMPORARY TABLE fred (dept SMALLINT NOT NULL, avg_salary DEC(7,2) NOT NULL, num_emps SMALLINT NOT NULL) ON COMMIT PRESERVE ROWS; -- lub ON COMMIT DELETE ROWS -- DECLARE, bo jej schemat nie jest zapisywany w katalogu systemowym i istnieje tylko na czas sesji (domyślny kwalifikator schematu tabeli session tj. session.fred). Objęte mechanizmem wycofywania ale nie odtwarzania po awarii! INSERT INTO fred SELECT dept, AVG(salary), COUNT(*) FROM staff WHERE id > 200 GROUP BY dept; SELECT COUNT(*) AS cnt FROM fred; DELETE FROM fred WHERE dept > 80; 39/125
Odróżnialny typ Aby uniemożliwić wspólne operacje np. na dwóch różnych walutach. CREATE DISTINCT TYPE Jap_Yen AS DECIMAL(15,2) WITH COMPARISONS; Wartości typu JAP_YEN nie mogą być porównywane z wartościami typu DECIMAL(15,2) 40/125
Indeksy CREATE INDEX idx1 ON tab1(col1) ; CREATE INDEX idx1 ON tab1(col1) CLUSTER ; -- indeks pogrupowany na tabeli tab1, może być niejednoznaczny. Gdy indeks na kluczu głównym ma być pogrupowany, to jest istotna kolejność: CREATE TABLE bez definiowania klucza głównego, CREATE INDEX CLUSTER ALTER TABLE PRIMARY KEY 41/125
Partycjonowana tabela 1. Każda partycja tabeli w innej przestrzeni tabel CREATE TABLE Customer (shipdate DATE, name CHAR(30)) IN ts1, ts2, ts3, ts4, ts5 PARTITION BY RANGE(shipdate) (STARTING FROM ('01/01/2009') ENDING AT ('12/31/2009') EVERY (3 MONTHS)) 2. Każda partycja tabeli w innej partycji bazy danych CREATE TABLE Sales (CUSTOMER VARCHAR(80), REGION CHAR(5), YEAR INTEGER) DISTRIBUTE BY HASH (YEAR) ORGANIZE BY DIMENSIONS (REGION, YEAR) 42/125
Perspektywy CREATE VIEW employee_view AS SELECT a.empno, a.firstnme, a.salary, a.workdept FROM employee a WHERE a.salary >= (SELECT AVG(b.salary) FROM employee b WHERE a.workdept = b.workdept); 43/125
Perspektywy CREATE TABLE p1(id INT CHECK (id < 100)); CREATE TABLE p2(id INT CHECK (id >= 100)); CREATE VIEW pv AS SELECT id FROM p1 UNION ALL SELECT id FROM p2 WITH CHECK OPTION WITH ROW MOVEMENT; WITH ROW MOVEMENT przy aktualizacji wiersz naruszający warunek CHECK zmienia tabelę. 44/125
Perspektywy lokalne WITH temp1(id,name) AS ( VALUES (1,'abc'), (2,'bcd'), (3,'cde')) SELECT id+100, UCASE(name) FROM temp1 ORDER BY name DESC; WITH temp1(col1) AS ( VALUES 0 UNION ALL SELECT col1 + 1 FROM temp1 WHERE col1 + 1 < 100 ) SELECT * FROM temp1; -- rekurencyjna 45/125
Terminologia SELECTów WITH get_matching_rows AS -- perspektywa lokalna (SELECT id, name, salary -- podzapytanie FROM staff WHERE id < 50 UNION ALL -- pełne zapytanie SELECT id, name, salary -- podzapytanie FROM staff WHERE id = 100 ) SELECT * -- podzapytanie FROM get_matching_rows ORDER BY id FETCH FIRST 10 ROWS ONLY FOR FETCH ONLY; 46/125
Tabela zmaterializowanego zapytania - materialized query table (perspektywa zmaterializowana) CREATE TABLE staff_summary AS (SELECT dept, COUNT(*) AS count_rows, SUM(id) AS sum_id FROM staff GROUP BY dept) DATA INITIALLY DEFERRED REFRESH IMMEDIATE; - Tabela utworzona z klauzulami określającymi źródło AS oraz parametry odświeżania REFRESH: IMMEDIATE budowa przy użyciu instrukcji REFRESH TABLE, następnie przy każdej zmianie źródłowych tabel, lub DEFERRED tylko za pomocą instrukcji REFRESH TABLE. - Fraza DATA INITIALLY DEFERRED wymagana. - Można tworzyć indeks (ale nie PRIMARY KEY ani UNIQUE). - Można tworzyć indeks pogrupowany (CLUSTER). 47/125
Instrukcja REFRESH TABLE REFRESH TABLE staff_summary; Dwa tryby odświeżania: INCREMENTAL (przyrostowy) w oparciu o dziennik zmian, NOT INCREMENTAL wyliczane od nowa całe zapytanie. Dziennik zmian (staging table) wymagany do odświeżania typu INCREMENTAL. Tworzony tak jak tabela, np: CREATE TABLE emp_sumry_s ( ) FOR staff_summary PROPAGATE IMMEDIATE; 48/125
Alias tabeli, perspektywy CREATE ALIAS employee_al1 FOR employee; 49/125
Nickname Nazwa dla odległej tabeli lub nie-relacyjnego obiektu, przy użyciu którego w zapytaniach można ich używać tak jakby były zwykłymi tabelami. CREATE NICKNAME emp FOR unixserver.production.employee; 50/125
Katalog systemowy w schemacie SYSCAT SELECT CAST(colname AS CHAR(18)) AS Name, CAST(typename AS CHAR(18)) AS Type, length AS Length, scale AS Scale, nulls AS Nulls FROM syscat.columns WHERE tabname = 'MASTER' AND tabschema = 'PL38219' ORDER BY colno; 51/125
Więzy spójności ALTER TABLE detail ADD CONSTRAINT detail_fk FOREIGN KEY (fk) REFERENCES master(id) ON DELETE CASCADE; ALTER TABLE tab1 ADD CONSTRAINT const1 CHECK (ABS(c1) > 100 OR c2 < 1000) ; 52/125
Wyszukiwanie danych Jak w Standardzie: v v v v v v Kolumny wyliczane Select count Select distinct Klauzule WHERE, ORDER BY Klauzula GROUP BY HAVING Predykaty LIKE, BETWEEN, IN 53/125
Zmienne systemowe CURRENT ISOLATION CURRENT DATE CURRENT LOCK TIMEOUT CURRENT PATH CURRENT SCHEMA CURRENT TIME CURRENT TIMESTAMP USER VALUES CURRENT DATE; -- lub SELECT CURRENT DATE FROM sysibm.sysdummy1; -- jak DUAL w Oracle 54/125
Operacje na czasie CURRENT TIMESTAMP + 1 DAY CURRENT DATE 3 MONTHS CURRENT TIME 1 HOUR - 80 MINUTES + 2 SECONDS DATE('2004-10-30') + 1 MONTH MONTHNAME(CURRENT DATE) DAYOFYEAR(CURRENT TIMESTAMP) TO_CHAR(CURRENT TIMESTAMP,'YYYY-MM-DD HH24:MI:SS') CHAR(CURRENT DATE, ISO) CHAR(CURRENT DATE, EUR) 55/125
Operacje na ciągach znaków 'String1' CONCAT ' String2 ' LENGTH(RTRIM('String1 ' )) LTRIM(' String1' ) LCASE('String1' ) UCASE('String1' ) SUBSTR('abcdef',2,3) REPLACE ( 'DINING', 'N', '--' ) SELECT SUBSTR(PROJNO,1, 2) AS PROJ_CLASS, PROJNAME FROM PROJECT WHERE PROJNO LIKE 'IF%'; SELECT LASTNAME CONCAT ', ' CONCAT FIRSTNAME FROM EMPLOYEE WHERE WORKDEPT = 'A00' ORDER BY NAME; 56/125
Podzapytania SELECT CAST(t.nr AS INT), t.empno, t.lastname, (SELECT deptname FROM department WHERE t.workdept = deptno) deptname FROM (SELECT empno, lastname, workdept, ROW_NUMBER() OVER() AS nr FROM employee) AS t WHERE t.nr <= 10 57/125
Numerowanie rekordów (funkcje analityczne) WITH temp AS ( SELECT id, name, dept, years, salary, RANK() OVER(ORDER BY salary DESC) AS row FROM staff ) SELECT * FROM temp WHERE row > 5 and row <= 10 ORDER BY row; Rank = 1+ liczba rekordów mniejszych od niego w danym porządku (mogą więc być przerwy w numeracji, jeśli dwa lub więcej rekordów ma ten sam rank w danym porządku). Rownumber, row_number = kolejny numer (bez przerw). 58/125
CASE SELECT FIRSTNME, LASTNAME, CASE WHEN salary < 40000 THEN 'Należy sie podwyżka' WHEN salary > 40000 and salary < 90000 THEN 'OK' ELSE 'Przeplacamy' END AS comment FROM EMPLOYEE; 59/125
Złączenia *) INNER JOIN ON *) LEFT OUTER JOIN ON *) RIGHT OUTER JOIN ON *) FULL OUTER JOIN ON 60/125
Klauzule FETCH FIRST i OPTIMIZE FOR SELECT years, name, id FROM staff ORDER BY years DESC FETCH FIRST 10 ROWS ONLY; Zamiast FETCH FIRST n ROWS ONLY można użyć OPTIMIZE FOR n ROWS wtedy zwracane są wszystkie wiersze, ze wskazówką dla optymalizatora, że przekazywanie wierszy do klienta będzie się odbywać blokami n wierszy. Może być używana też bez ORDER BY. 61/125
Funkcja TABLE SELECT a.id, a.dept, a.salary, b.deptsal FROM staff a, TABLE (SELECT b.dept, SUM(b.salary) AS deptsal FROM staff b WHERE b.dept = a.dept GROUP BY b.dept ) AS b WHERE a.id < 40 ORDER BY a.id; Wymagana gdy podzapytanie odwołuje się do wierszy zewnętrznych tabel. Ale można było zastosować tu operator INNER JOIN bez korzystania z TABLE. 62/125
Przykład z funkcją TABLE SELECT id, salary AS sal, comm AS com, w, typ FROM staff, TABLE(VALUES (salary,'sal'), (comm, 'COM') ) AS tab(w, typ) WHERE id < 40 ORDER BY id, typ; 63/125
INSERT v v v v Create table A(liczba int, napis varchar(10)); Insert into A values (1,'aaa'); Insert into A (liczba) values(2); Insert into A values (3,'ccc'),(4,'ddd'),(5,'eee'); v Select * from A; v Create table B(liczba int, napis varchar(10)); v Insert into B (select * from A) ; 64/125
Wstawianie do dwóch tabel CREATE TABLE Us_customer (Cust# INTEGER NOT NULL, Cname CHAR(10) NOT NULL, Country CHAR(3) NOT NULL, CHECK (Country = 'USA'), PRIMARY KEY (Cust#)); CREATE TABLE Intl_customer (Cust# INTEGER NOT NULL, Cname CHAR(10) NOT NULL, Country CHAR(3) NOT NULL, CHECK (Country <> 'USA'), PRIMARY KEY (Cust#)); INSERT INTO (SELECT * FROM Us_customer UNION ALL (SELECT * FROM Intl_customer) VALUES (111,'Fred','USA'), (222,'Dave','USA'),(333,'Juan','MEX')); Połączenie dwóch instrukcji w jedną w celu zwiększenia wydajności. 65/125
Modyfikowanie danych - UPDATE v v Update B set liczba = liczba+10 where liczba<4; Update B set liczba = liczba+10, napis = 'cccc' where liczba = 12; v Update A set (liczba,napis) = (select liczba, napis from B where liczba = 22) where liczba = 2; 66/125
Usuwanie danych - DELETE v Delete from C where v Delete from (select rownumber() over(order by liczba) as rowid from A) where rowid>4; 67/125
Wyświetlanie modyfikowanych wierszy OLD TABLE, NEW TABLE, FINAL TABLE v v v Select from OLD TABLE (Delete from Select * from [NEW FINAL] TABLE (Insert into A values(10,'kkk'),(11,'mmm'),(12,'ooo')); Select from [NEW FINAL] TABLE (Update. NEW stan po wykonaniu instrukcji a przed wykonaniem wyzwalaczy AFTER i akcji referencyjnych FINAL stan na sam koniec po wykonaniu wyzwalaczy AFTER i akcji referencyjnych Połączenie dwóch instrukcji w jedną w celu zwiększenia wydajności. 68/125
MERGE Włóż wiersze tabeli u do tabeli g stosując UPDATE gdy wiersz z datą istnieje w g, wpp stosując INSERT. MERGE INTO main g USING (SELECT data,swieto FROM upd_main) u ON (g.data = u.data) WHEN MATCHED THEN UPDATE SET swieto = u.swieto WHEN NOT MATCHED THEN tylko INSERT lub SIGNAL INSERT (data,swieto) VALUES (u.data, u.swieto) [NOT] MATCHED [AND warunek_wyszukiwania] Połączenie INSERT, UPDATE, DELETE na jednej tabeli. Zwiększenie wydajności. 69/125
UNION, INTERSECT, EXCEPT v v v UNION i UNION ALL INTERSECT i INTERSECT ALL EXCEPT i EXCEPT ALL 70/125
TRANSAKCJE * Transakcje rozpoczynają się niejawnie. * Każda baza danych w DB2 jest transakcyjna. * Można wyłączyć tworzenie pozycji transakcji w dzienniku transakcji na poziomie tabeli na czas trwania transakcji (do jej końca). ALTER TABLE tabela ACTIVATE NOT LOGGED INITIALLY; 71/125
Poziomy izolacji Odejście od nazw w Standardzie. * UR : brak blokad, chyba, że dany rekord jest zmieniany (UNCOMMITTED READ) * CS : blokada na wierszu tylko przy odczycie rekordu (COMMITTED READ) * RS : blokada do odczytu utrzymywana do końca transakcji (REPEATABLE READ) * RR : niezmienny wynik każdego zapytania w trakcie trwania transakcji (SERIALIZABLE) 72/125
Blokowane obiekty 73/125
Blokady na tabeli Dla transakcji realizowanej w trybie READ UNCOMMITTED IN IS IX SIX S U X Z Intent None Intention Share Intention exclusive Share with Intention exclusive Share Update exclusive superexclusive Obejmuje też blokady wierszy Tylko blokada tabeli Z do wykonania ALTER i DROP na tabeli oraz CREATE i DROP na indeksie tabeli. 74/125
Blokady na wierszu Blokada wiersza Minimalna wspomagająca blokada na tabeli S U X W NS NW Share Update exclusive Weak exclusive Next key Share Next key Weak exclusive IS IX IX IX IS IX Aplikacja nie uzyskuje jeśli założyła blokadę na tabeli: blokady wierszy S, U, X lub Z 75/125
Dodatkowe rodzaje wierszowych blokad v v v Weak Exclusive W zakładana na wiersz wstawiany do tabeli (na tabeli IX) słabsza niż X na tym wierszu. Next Key Weak Exclusive NW gdy do indeksu jest dodawana nowa pozycja (na tabeli IX) słabsza niż X na tym wierszu. Next Key Share NS zakładana na wiersz podczas pełnego odczytu tabeli w trybie READ COMMITTED i REPEATABLE READ (na tabeli IS) słabsza niż S na tym wierszu. 76/125
77/125 Kompatybilność trybów blokad U YES NO NO NO YES NO NS YES YES NO NO YES YES W NO NO NO NO NO YES B A IN IS S IX SIX U X Z Tabelowe B A S U X W NS NW Wierszowe IS YES YES YES YES YES YES NO NO S YES YES YES NO NO YES NO NO IX YES YES NO YES NO NO NO NO IN YES YES YES YES YES YES YES NO X NO NO NO NO NO NO S YES YES NO NO YES NO NW NO NO NO YES YES NO SIX YES YES NO NO NO NO NO NO U YES YES YES NO NO NO NO NO X YES NO NO NO NO NO NO NO Z NO NO NO NO NO NO NO NO
Blokady explicite -- Zapytanie tylko do odczytu SELECT * FROM tab1 FOR READ ONLY; -- Zapytanie może uaktualniać rekordy w trakcie przemieszczania się kursora po zbiorze wynikowym SELECT * FROM tab1 FOR UPDATE; -- Do instrukcji SELECT, SELECT INTO, DELETE, UPDATE można dołączyć poziom izolacji: WITH RR, WITH RS, WITH CS, WITH UR. 78/125
Konwersja blokady v Gdy aplikacja posiadając już pewną blokadę na obiekcie, chce zamienić tę blokadę na silniejszą (np. U na X, IS na S, IX na X) Silniejsza blokada może być przyznana lub nie. v Przykład Aplikacja wybiera wiersz w tabeli używając klauzuli FOR UPDATE u Na wiersz jest zakładana blokada U (Update) Aplikacja dokonuje modyfikacji wiersza używając klauzuli WHERE CURRENT OF u Zachodzi konwersja blokady U na X 79/125
Parametry inicjalizacyjne bazy danych dotyczące blokad Locklist ilość miejsca pamięci do użycia przez blokady. Maxlocks maksymalny procent miejsca pamięci z Locklist przeznaczony do użycia przez pojedynczą transakcję. Gdy transakcja przekroczy Maxlocks, system zamienia blokady na wierszach na blokady na tabelach (eskalacja blokad). 80/125
Blokada tabeli ALTER TABLE tabela LOCKSIZE TABLE; -- (blokowanie tabeli zamiast domyślnie wierszy) Wskazane, gdy DML dotyczy większości wierszy dużej tabeli. Z powrotem do blokowania wierszy (które jest domyślne): ALTER TABLE tabela LOCKSIZE ROW; LOCK TABLE tabela IN [SHARE EXCLUSIVE] MODE (blokada zwalniana na koniec transakcji) 81/125
Blokada bazy danych/przestrzeni tabel (explicite) CONNECT TO database IN [EXCLUSIVE SHARE] MODE Blokada bazy danych: CONNECT TO database IN EXCLUSIVE MODE Blokada przestrzeni tabel: QUIESCE table-spaces FOR TABLE table-name INTENT FOR UPDATE; 82/125
Tworzenie typów obiektowych CREATE TYPE DEPT AS ( DEPT NAME VARCHAR(20), MAX_EMPS INT) REF USING INT MODE DB2SQL -- MODE DB2SQL wymagany CREATE TYPE EMP AS ( NAME VARCHAR(32), SERIALNUM INT, DEPT REF(DEPT), SALARY DECIMAL(10,2)) MODE DB2SQL CREATE TYPE MGR UNDER EMP AS ( BONUS DECIMAL(10,2)) MODE DB2SQL Ewentualna specyfikacja metody po słowie kluczowym METHOD. Niezależnie, implementacja metody: CREATE METHOD BONUS (RATE DOUBLE) FOR EMP RETURN SELF..SALARY * RATE 83/125
Przykład tabeli z podtabelami Hierarchia typów obiektowych: Typy obiektowe: BusinessUnit_t, Person_t Podtypy: Student_t UNDER Person_t, Employee_t UNDER Person_t, Manager_t UNDER Employee_t, Architect_t UNDER Employee_t 84/125
Tworzenie hierarchii tabel odpowiadającej hierarchii typów CREATE TABLE BUnit OF BusinessUnit_t (REF IS Oid USER GENERATED); CREATE TABLE Person OF Person_t (REF IS Oid USER GENERATED); CREATE TABLE Employee OF Employee_t UNDER Person INHERIT SELECT PRIVILEGES -- wymagana klauzula dla podtabel (SerialNum WITH OPTIONS NOT NULL, Dept WITH OPTIONS SCOPE BUnit ); CREATE TABLE Student OF Student_t UNDER Person INHERIT SELECT PRIVILEGES; CREATE TABLE Manager OF Manager_t UNDER Employee INHERIT SELECT PRIVILEGES; CREATE TABLE Architect OF Architect_t UNDER Employee INHERIT SELECT PRIVILEGES; 85/125
Instrukcje SQL na nadtabeli i jej podtabelach Instrukcje SELECT, UPDATE, DELETE operujące na nadtabeli, domyślnie działają również na wszystkich wierszach jej podtabel. Np. UPDATE na tabeli Employee dotyczy wierszy tabel Employee, Manager i Architect, ale UPDATE na tabeli Manager dotyczy tylko wierszy tabeli Manager. Aby ograniczyć działanie instrukcji wyłącznie do danej tabeli należy użyć opcji ONLY (np. ONLY Employee). 86/125
Jak zaszyfrować kluczowe dane? SET ENCRYPTION PASSWORD = 'Ben123'; INSERT INTO EMP(SSN) VALUES ENCRYPT ('289-46-8832'); INSERT INTO EMP(SSN) VALUES ENCRYPT ('289-46-8832', 'Ben123'); SELECT DECRYPT_CHAR (SSN,'Ben123') FROM EMP; 87/125
LBAC (Label Based Access Control) Poziom dostępu definiowany dla tabel i wierszy tabel. SELECT * FROM EMP WHERE SALARY >= 50000 & Poziom dostępu użytkownika = 100 Użytkownicy na poziomie 100 mają dostęp do wierszy: ID <= 100 i salary >= 50000 (na zielono) No LBAC LBAC ID 255 100 50 50 60 250 SALARY 60000 50000 70000 45000 30000 56000 Gdy opcja LBAC nie jest włączona, użytkownicy za pomocą powyższego zapytania mają dostęp do wierszy: salary >= 50000 (na czerwono) 102 100 75 253 82000 54000 33000 46000 Ułatwienie zarządzania uprawnieniami dostępu użytkowników do danych 90 200 105 83000 78000 45000 88/125
Język procedur składowanych SQL Procedural Language (SQL PL) 89/125
Przypisanie wartości zmiennym Instrukcje w kodzie: SET zmienna = wyrażenie VALUES wyrażenie, INTO zmienna, 90/125
Instrukcja złożona (blok), zmienne BEGIN DECLARE v_var1 CHAR(20); DECLARE v_var2 INTEGER; DECLARE v_var3 TIMESTAMP; DECLARE v_var4 SMALLINT DEFAULT 99; SELECT name INTO v_var1 FROM staff FETCH FIRST 1 ROW ONLY; SET v_var2 = 100; VALUES CURRENT TIMESTAMP INTO v_var3; VALUES (p_par1,99) INTO v_var4,v_var2; END 91/125
ATOMIC, NOT ATOMIC BEGIN ATOMIC -- SQL e traktowane są jak jedno polecenie END -- nieobsłużony błąd -> zatrzymanie wykonywania -> -- wszystkie zmiany zostają wycofane BEGIN ATOMIC nie może być zagnieżdżony w BEGIN ATOMIC --------------------------------------------- BEGIN NOT ATOMIC -- to jest domyślna opcja END -- nieobsłużony błąd -> zatrzymanie wykonywania -> -- Zmiany pozostają. Konieczne ręczne wycofanie. 92/125
Etykiety instrukcji złożonej lab1: BEGIN DECLARE v_id INT; lab2: BEGIN DECLARE v_id INT; SET lab1.v_id = 1; SET lab2.v_id = 10; SET v_id = 100; END lab2; END lab1 93/125
Instrukcje warunkowe IF v_var = 1 THEN UPDATE ELSE INSERT END IF; --------------------------------------------- CASE WHEN v_var > 0 THEN WHEN v_var > 10 THEN ELSE END CASE; 94/125
Iteracje WHILE (var1 = 1) DO END WHILE; --------------------------------------------- REPEAT UNTIL (var1 < 100) END REPEAT; --------------------------------------------- label:loop LEAVE label; ITERATE label; END LOOP; --------------------------------------------- GOTO label; 95/125
Instrukcja złożona i WHILE BEGIN ATOMIC DECLARE cnt INT DEFAULT 0; WHILE (cnt < 1000) DO INSERT INTO Tab1 VALUES (cnt, ceiling(rand()*1000) ); SET cnt=cnt+1; END WHILE; END Średniki oddzielają składowe instrukcje w instrukcji złożonej. Średnik nie może kończyć zewnętrznej instrukcji złożonej ani też końca instrukcji CREATE PROCEDURE. W skryptach można określić terminator przy użyciu -- #SET DELIMITER 96/125
Instrukcja FOR FOR loop_name AS SELECT col1, FROM DO SET var1 = loop_name.col1; END FOR; 97/125
Przykład BEGIN ATOMIC DECLARE cntr SMALLINT DEFAULT 1; FOR V AS SELECT id AS idval FROM staff WHERE id < 80 ORDER BY id DO UPDATE staff SET comm = cntr WHERE id = V.idval; SET cntr = cntr + 1; END FOR; END 98/125
Instrukcja złożona BEGIN ATOMIC DECLARE v_var2 INTEGER; CREATE TABLE mytab(id INT); CREATE INDEX mytab_idx ON mytab(id); BEGIN DECLARE v_var4 INTEGER DEFAULT 100; INSERT INTO mytab(id) VALUES (99),(v_var4); GET DIAGNOSTICS v_var2 = ROW_COUNT; SET p_result = 'L.wierszy: ' char(v_var2); END; END GET DIAGNOSTICS wymagane, aby uzyskać ROW_COUNT! 99/125
ITERATE, LEAVE BEGIN ATOMIC DECLARE cntr INT DEFAULT 0; whileloop: WHILE cntr < 60 DO SET cntr = cntr + 10; UPDATE staff SET salary = cntr WHERE id = cntr; IF RAND() < 0.5 THEN LEAVE whileloop; ELSEIF RAND() < 0.2 THEN ITERATE whileloop; ELSE UPDATE staff SET comm = cntr + 1 WHERE id = cntr; END IF; END WHILE; END 100/125