Perspektywy zmaterializowane - migawki CIO.WAR.PL Ogólna architektura NET8 dblink SIEC CIO2.POZ.PL NET8 WO select... from konta@wo.cio.war.pl, klienci@po2.cio2.poz.pl...; insert into konta@cio.war.pl...; update konta@cio2.poz.pl...; commit; PO2 (c) Robert Wrembel, Politechnika Poznanska, Instytut Informatyki 2
Dolaczenie bazodanowe CREATE [PUBLIC] DATABASE LINK nazwa CONNECT TO uzytkownik IDENTIFIED BY haslo USING nazwa_bazy_danych ; create database link LAB.WORLD connect to scott identified by tiger using 'LAB.WORLD'; domyslnie tworzone dolaczenie prywatne tworzenie dolaczenia publicznego wymaga uprawnienia CREATE PUBLIC DATABASE LINK select * from emp@lab.world; select * from scott.emp@lab.world; select * from usr.accounts@lab.world; scott musi posiadac uprawnienie SELECT do tabeli accounts w schemacie USR (c) Robert Wrembel, Politechnika Poznanska, Instytut Informatyki 3 Dolaczenie bazodanowe (2) update emp@lab.world set sal=sal*. where deptno=0; create table employees as select * from emp@lab.world; pierwsze odwolanie do dolaczenia otwiera je dolaczenie pozostaje otwarte do konca sesji lub jawnego jego zamkniecia poleceniem: ALTER SESSION CLOSE DATABASE LINK nazwa; przed zamknieciem dolaczenia nalezy zakonczyc transakcje korzystajaca z niego select * from scott.emp@lab.world; alter session close database link LAB.WORLD; ERROR: ORA-02080: database link is in use (c) Robert Wrembel, Politechnika Poznanska, Instytut Informatyki 4 2
Replikacja danych synchroniczna / natychmiastowa asynchroniczna / opózniona standardowa LAB update emp@orc...; insert into emp@orc...; delete emp@orc...; SIEC ORC select emp replika select insert update delete emp tabela master (c) Robert Wrembel, Politechnika Poznanska, Instytut Informatyki 5 Replikacja danych (2) zaawansowana (Oracle Advanced Replication Option) LAB SIEC ORC insert update delete insert update delete emp replika insert, update, delete emp tabela master (c) Robert Wrembel, Politechnika Poznanska, Instytut Informatyki 6 3
Replika replika - migawka (ang. snapshot) -> kopia tabel znajdujacych sie w odleglych bazach danych definicja zawiera: zapytanie odwolujace sie do tabel (zwanych master) w zdalnych bazach danych sposób odswierzania danych migawki czestotliwosc odswierzania danych migawki standardowo tylko do odczytu przywileje systemowe niezbedne do tworzenia: CREATE SNAPSHOT, CREATE TABLE, CREATE VIEW CREATE ANY SNAPSHOT (c) Robert Wrembel, Politechnika Poznanska, Instytut Informatyki 7 Migawka rodzaje migawek PRIMARY KEY tabela master musi posiadac wlaczone ograniczenie PRIMARY KEY klauzula SELECT musi zawierac wszystkie atrybuty wchodzace w sklad klucza podstawowego tabeli master ROWID migawka prosta bazujaca na jednej tabeli master brak klauzul: GROUP BY, CONNECT BY, DISTINCT brak funkcji, polaczen, operatorów zbiorowych migawka zlozona implementacja migawki: tabela + perspektywa + indeksy (c) Robert Wrembel, Politechnika Poznanska, Instytut Informatyki 8 4
Tworzenie migawki CREATE SNAPSHOT [schemat.]migawka [ parametry_fizyczne ] [ TABLESPACE nazwa_przestrzeni ] [ USING INDEX [ parametry_fizyczne ] [ TABLESPACE nazwa_przestrzeni ] ] [ REFRESH { FAST COMPLETE FORCE } ] [ WITH { PRIMARY KEY ROWID } ] [ START WITH data ] [ NEXT data ] [ USING [ LOCAL ROLLBACK SEGMENT rbs ] [ MASTER ROLLBACK SEGMENT rbs ] ] AS SELECT...; parametry_fizyczne bloku: PCTFREE, PCTUSED (nie dla indeksu), INITRANS, MAXTRANS rozszerzen: STORAGE INITIAL, NEXT, MINEXTENTS, MAXEXTENTS, PCTINCREASE (c) Robert Wrembel, Politechnika Poznanska, Instytut Informatyki 9 sposób odswiezania Odswiezanie migawki REFRESH FAST -> odswiezanie przyrostowe dla migawek prostych musi istniec SNAPSHOT LOG dla tabeli master REFRESH COMPLETE -> odswiezanie pelne REFRESH FORCE -> automatyczny wybór metody odswiezania; jezeli mozliwe to Oracle wybiera FAST okres odswiezania START WITH -> data pierwszego odswiezenia NEXT -> wyrazenie okreslajace czestotliwosc odswiezania Odswiezanie automatyczne musi byc wyspecyfikowany parametr NEXT okreslenie czestotliwosci odswiezania REFRESH FAST START WITH sysdate NEXT sysdate+ REFRESH FAST NEXT sysdate+ (c) Robert Wrembel, Politechnika Poznanska, Instytut Informatyki 0 5
Odswiezanie automatyczne (2) wlaczenie procesu odpowiedzialnego za odswiezanie parametr konfiguracyjny SNAPSHOT_REFRESH_PROCESSES -> wartosc wieksza od 0 (max. 0) -> procesy drugoplanowe SNP 0 - SNP 9 SNAPSHOT_REFRESH_INTERVAL domyslnie 60 sekund SNAPSHOT_REFRES_KEEP_CONNECTIONS domyslnie FALSE Odswiezanie reczne wylaczenie procesu odpowiedzialnego za odswiezanie SNAPSHOT_REFRESH_PROCESSES=0 brak parametru NEXT REFRESH FAST START WITH sysdate migawka odswiezona raz, w momencie jej tworzenia (c) Robert Wrembel, Politechnika Poznanska, Instytut Informatyki Odswiezanie reczne (2) procedura DBMS_SNAPSHOT.REFRESH DBMS_SNAPSHOT.REFRESH ( sn, sn 2,..., sn n, metoda ) sn, sn 2,..., sn n : migawki metoda: metoda odswiezania f lub F: FAST c lub C: COMPLETE?: domyslny DBMS_SNAPSHOT.REFRESH ( s_dept, s_emp, s_emp, C ) DBMS_SNAPSHOT.REFRESH ( s_dept, s_emp, s_emp, CF ) domyslny (c) Robert Wrembel, Politechnika Poznanska, Instytut Informatyki 2 6
Przyklad create snapshot sn_emp pctfree 30 pctused 30 storage (initial 0K next 0K pctincrease 0 minextents maxextents 0) tablespace usr refresh fast start with sysdate+/(24*60) next sysdate+/(24*60*6) with rowid odswiezanie co 0 sek. using local rollback segment rb master rollback segment rb04 as select * from emp@lab.world; SNAP$_SN_EMP -> TABLE I_SNAP$_SN_EMP -> INDEX SN_EMP -> VIEW zawiera kolumne M_ROW$$ przechowujaca ROWID rekordów tabeli emp@lab.world na kolumnie SNAP$_SN_EMP.M_ROW$$ (c) Robert Wrembel, Politechnika Poznanska, Instytut Informatyki 3 Modyfikowanie migawki ALTER SNAPSHOT [schemat.]migawka [ parametry_fizyczne ] [ USING INDEX [ parametry_fizyczne ] [ REFRESH { FAST COMPLETE FORCE } ] [ WITH PRIMARY KEY ] [ START WITH data ] [ NEXT data ] [ USING MASTER ROLLBACK SEGMENT rbs ]; parametry_fizyczne bloku: PCTFREE, PCTUSED (nie dla indeksu), INITRANS, MAXTRANS rozszerzen: STORAGE NEXT, MINEXTENTS, MAXEXTENTS, PCTINCREASE alter snapshot sn_emp pctfree 20 pctused 40 initrans 4 storage (next 20K pctincrease 0 minextents maxextents 20) refresh complete start with sysdate next sysdate+/(24*60*0) with primary key using master rollback segment rb03; (c) Robert Wrembel, Politechnika Poznanska, Instytut Informatyki 4 7
Dziennik migawki (ang. snapshot log) tabela zwiazana z tabela master migawki przechowuje zmiany dokonane na danych tabeli master wykorzystywany do odswiezania przyrostowego tworzenie: CREATE SNAPSHOT LOG ON [schemat.]tabela [ parametry_fizyczne ] [ TABLESPACE nazwa_przestrzeni ] [ WITH { PRIMARY KEY ROWID { PRIMARY KEY, ROWID } } WITH PRIMARY KEY: wartosci atrybutów wchodzacych w sklad klucza rekordów uaktualninych sa rejestrowane w dzienniku WITH ROWID: ROWID rekordów uaktualnionych rejestrowane w dzienniku WITH PRIMARY KEY, ROWID: w dzienniku rejestrowane zarówno wartosci atr. kluczowych, jak i ROWID (c) Robert Wrembel, Politechnika Poznanska, Instytut Informatyki 5 Przyklad create snapshot log on scott.emp pctfree 30 pctused 30 initrans 2 maxtrans 0 storage (initial 0K next 0K pctincrease 0 minextents maxextents 0) tablespace lab_dane with primary key, rowid; MLOG$_EMP Name Type ----------------- ------------- EMPNO NUMBER(4) M_ROW$$ VARCHAR2(255) SNAPTIME$$ DATE DMLTYPE$$ VARCHAR2() OLD_NEW$$ VARCHAR2() CHANGE_VECTOR$$ RAW(255) (c) Robert Wrembel, Politechnika Poznanska, Instytut Informatyki 6 8
Przyklad (2) insert into emp values (000, 'BOND', 'MANAGER', NULL, '0-JAN-99', 6000, 500, 30); update emp set comm=comm+300 where empno=7839; delete from emp where empno=7698; select * from mlog$_emp; EMPNO M_ROW$$ SNAPTIME$ DML OLD_ CHANGE_ TYPE$$ NEW$$ VECTOR$$ ----- ------------------ --------- ------ ----- -------- 000 AAAApTAACAAAAn5AAD 0-JAN-00 I N FEFF 7839 AAAApTAACAAAAn5AAA 0-JAN-00 U U 8000 7698 AAAApTAACAAAAn5AAB 0-JAN-00 D O 0000 (c) Robert Wrembel, Politechnika Poznanska, Instytut Informatyki 7 Modyfikowanie dziennika migawki ALTER SNAPSHOT LOG ON [schemat.]tabela [ parametry_fizyczne ] [ ADD { PRIMARY KEY ROWID } ]; parametry_fizyczne bloku: PCTFREE, PCTUSED, INITRANS, MAXTRANS rozszerzen: STORAGE NEXT, MINEXTENTS, MAXEXTENTS, PCTINCREASE Usuwanie migawki DROP SNAPSHOT [schemat.]migawka; Usuwanie dziennika migawki DROP SNAPSHOT LOG ON [schemat.]tabela; (c) Robert Wrembel, Politechnika Poznanska, Instytut Informatyki 8 9
Informacje o migawkach USER_SNAPSHOTS, ALL_SNAPSHOTS, DBA_SNAPSHOTS select name, table_name, master_owner, master, master_link, refresh_method, type, master_rollback_seg from dba_snapshots; NAME TABLE_NAME MASTER MASTER MASTER REFRESH TYPE MASTER OWNER LINK METHOD RBS ---------- ------------- ----- ------ ---------- ----------- -------- ------ SN_EMP SNAP$_SN_EMP SCOTT EMP @LAB.WORLD ROWID FAST SN_EMP SNAP$_SN_EMP SCOTT EMP @LAB.WORLD PRIMARY KEY COMPLETE RB04 (c) Robert Wrembel, Politechnika Poznanska, Instytut Informatyki 9 Informacje o dziennikach migawek USER_SNAPSHOT_LOGS, ALL_SNAPSHOT_LOGS, DBA_SNAPSHOT_LOGS select log_owner, master, log_table, rowids, primary_key, filter_columns, current_snapshots, snapshot_id from user_snapshot_logs; LOG MASTER LOG_TABLE ROWIDS PRIMARY FILTER CURRENT SNAPS. OWNER KEYS COLS. SNAPS. ID ------ ---------- ------------ ------ ------- ------ --------- -------- SCOTT EMP MLOG$_EMP YES YES NO 25-JAN-00 57 SCOTT EMP MLOG$_EMP YES YES NO 25-JAN-00 58 (c) Robert Wrembel, Politechnika Poznanska, Instytut Informatyki 20
Informacje o odswiezaniu migawek USER_SNAPSHOT_REFRESH_TMIES, ALL_SNAPSHOT_REFRESH_TIMES, DBA_SNAPSHOT_REFRESH_TIMES select owner, master_owner, name, master, to_char(last_refresh, 'dd-mm-yyyy:hh24:mi:ss') refresh from user_snapshot_refresh_times; MASTER LAST OWNER OWNER NAME MASTER REFRESH ----- ----- ------- ------ ------------------- ORC SCOTT SN_EMP EMP 26-0-2000::5:36 ORC SCOTT SN_EMP EMP 25-0-2000:22:07:28 (c) Robert Wrembel, Politechnika Poznanska, Instytut Informatyki 2 Informacje o zarejestrowanych migawkach w bazie master DBA_REGISTERED_SNAPSHOTS select owner, name, snapshot_site, can_use_log, updatable, refresh_method, snapshot_id, version from dba_registered_snapshots; REFRESH OWNER NAME CAN_USE_LOG UPD METHOD SNAPSHOT_ID VERSION ------ -------- ------------ --- ----------- ----------- ----------------- ORC SN_EMP ORC.WORLD NO ROWID 58 ORACLE 8 SNAPSHOT ORC SN_EMP ORC.WORLD NO PRIMARY KEY 57 ORACLE 8 SNAPSHOT select sl.master "Master table", sl.log_table, rs.name as "Snp.name" from dba_snapshot_logs sl, dba_registered_snapshots rs where sl.snapshot_id=rs.snapshot_id; Master table LOG_TABLE Snp.name ------------ ------------ --------- EMP MLOG$_EMP SN_EMP EMP MLOG$_EMP SN_EMP (c) Robert Wrembel, Politechnika Poznanska, Instytut Informatyki 22
Wiele niezaleznych migawek - problem migawka sn_dept dept tabela master 0 ACCOUNTING 20 RESEARCH 30 SALES 40 OPERATIONS insert into dept values (50, 'INF.TECHNOLOGY', 'LONDON'); update emp set deptno=50 where ename= BLAKE ; migawka sn_emp 2 emp tabela master 3 exec dbms_snapshot.refresh('sn_emp', 'f') ename deptno ---------- ---------- BLAKE 50? (c) Robert Wrembel, Politechnika Poznanska, Instytut Informatyki 23 Grupy odswiezania (ang. refresh groups) odswiezane jednoczesnie spójnosc danych migawek Tworzenie grupy odswiezania DBMS_REFRESH.MAKE ( name, list, next_date, interval, implicit_destroy, rollback_seg ) nazwa grupy lista migawek przypisywanych do grupy; data nastepnego odswiezenia okres odswiezania TRUE: usuniecie grupy jezeli nie zawiera migawek (zob. SUBTRACT) domyslnie FALSE rbs wykorzystywany do odswiezania lista migawek migawki musza byc w tej samej bd moga byc w róznych schematach max. 00 migawek w grupie (c) Robert Wrembel, Politechnika Poznanska, Instytut Informatyki 24
Tworzenie grupy odswiezania(2) exec DBMS_REFRESH.MAKE (name => 'orc.rg_dept_emp', - list => 'orc.sn_dept, orc.sn_emp', - next_date => sysdate+/48, - interval => 'next_day(trunc(sysdate), ''FRIDAY'')+0/24', - implicit_destroy => TRUE, - rollback_seg => 'rb') Dodanie migawki do grupy exec DBMS_REFRESH.ADD ('orc.rg_dept_emp', orc.sn_emp') Usuniecie migawki z grupy exec DBMS_REFRESH.SUBTRACT('orc.rg_dept_emp', 'orc.sn_emp') (c) Robert Wrembel, Politechnika Poznanska, Instytut Informatyki 25 Zmiana parametrów grupy DBMS_REFRESH.CHANGE ( name, exec DBMS_REFRESH.CHANGE next_date, ( name => 'orc.rg_dept_emp', - interval, next_date => sysdate+/(48*60), - implicit_destroy, interval => 'next_day(trunc(sysdate), ''SATURDAY'')+8/24', - rollback_seg ) implicit_destroy => FALSE, - rollback_seg => 'rb0') Manualne odswiezanie grupy exec DBMS_REFRESH.REFRESH('orc.rg_dept_emp') Usuniecie grupy odswiezania usuwa grupe z migawkami lub pusta exec DBMS_REFRESH.DESTROY('orc.rg_dept_emp') (c) Robert Wrembel, Politechnika Poznanska, Instytut Informatyki 26
Informacje na temat utworzonych grup USER_REFRESH_CHILDREN, ALL_REFRESH_CHILDREN, DBA_REFRESH_CHILDREN select rowner, rname, refgroup, implicit_destroy, rollback_seg, next_date, interval, broken from user_refresh; Impl. Rollb. ROWNER RNAME REFGROUP destr. segm. NEXT_DATE INTERVAL Broken ------ ----------- --------- ------ ------ --------- ------------------------ ------ ORC RG_DEPT_EMP 96 N RB0 26-JAN-00 next_day(trunc(sysdate), N 'SATURDAY')+8/24 jezeli automatyczne odswiezanie stalo sie niemozliwe: proces odswiezajacy wykonuje n prób odswiezenia w odstepach, 2, 4, 8, 6,... minut (nie przekracza zadanego okresu odswiezania grupy, n= max. 6) jezeli n-ta próba niepomyslna ustawiana wartosc BROKEN=Y po usunieciu problemu odswiezenie manualne (BROKEN=N) -> przywrócenie odswiezania automatycznego (c) Robert Wrembel, Politechnika Poznanska, Instytut Informatyki 27 Informacje na temat migawek w grupie USER_REFRESH, ALL_REFRESH, DBA_REFRESH select owner, name, type, rowner, rname from user_refresh_children; OWNER NAME TYPE ROWNER RNAME -------- ------------ --------- -------- ------------ ORC SN_DEPT SNAPSHOT ORC RG_DEPT_EMP ORC SN_EMP SNAPSHOT ORC RG_DEPT_EMP (c) Robert Wrembel, Politechnika Poznanska, Instytut Informatyki 28
Przepisywanie zapytania Query rewriting create materialized view suma_sprzedazy build immediate refresh complete enable query rewrite as select nazwa, sum(l_sztuk*cena_jedn) suma from sprzedaz sp, sklepy sk where sp.sklep_id=sk.sklep_id group by nazwa; select nazwa, sum(l_sztuk*cena_jedn) suma from sprzedaz sp, sklepy sk where sp.sklep_id=sk.sklep_id having sum(l_sztuk*cena_jedn) > 30000 group by nazwa; Execution Plan --------------------------------------------------- 0 SELECT STATEMENT Optimizer=CHOOSE 0 TABLE ACCESS (FULL) OF 'SUMA_SPRZEDAZY' (c) Robert Wrembel, Politechnika Poznanska, Instytut Informatyki 29 Przepisywanie zapytania (2) select nazwa, sum(l_sztuk*cena_jedn) suma from sprzedaz sp, sklepy sk where sp.sklep_id=sk.sklep_id and sk.miasto='poznan' group by nazwa; Execution Plan ---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=CHOOSE 0 SORT (GROUP BY) 2 NESTED LOOPS 3 2 TABLE ACCESS (FULL) OF 'SKLEPY' 4 2 TABLE ACCESS (FULL) OF 'SPRZEDAZ' (c) Robert Wrembel, Politechnika Poznanska, Instytut Informatyki 30
Przepisywanie zapytania (3) alter materialized view nazwa_perspektywy {enable disable} query rewrite; O tym, czy zmaterializowana perspektywa zostanie wykorzystana do zamiany zapytania decyduja dodatkowo trzy parametry konfiguracyjne instancji: OPTIMIZER_MODE, QUERY_REWRITE_ENABLED i QUERY_REWRITE_INTEGRITY Zamiana zapytania jest mozliwa tylko wówczas, gdy: System wykorzystuje optymalizator kosztowy, tj. () parametr konfiguracyjny instancji OPTIMIZER_MODE przyjmuje wartosc choose i (2) dla tabel bazowych zebrano statystyki Parametr konfiguracyjny QUERY_REWRITE_ENABLED przyjmie wartosc true (c) Robert Wrembel, Politechnika Poznanska, Instytut Informatyki 3