Materializowanie wyników zapytania

Podobne dokumenty
Hurtownie danych - przegląd technologii Robert Wrembel Politechnika Poznańska Instytut Informatyki

Perspektywy zmaterializowane

Hurtownie danych - przegląd technologii

Rozproszone bazy danych 1

Modelowanie wymiarów

Oracle10g Database: struktury fizyczne dla hurtowni danych

Język SQL. Rozdział 10. Perspektywy Stosowanie perspektyw, tworzenie perspektyw prostych i złożonych, perspektywy modyfikowalne i niemodyfikowalne.

Perspektywy Stosowanie perspektyw, tworzenie perspektyw prostych i złożonych, perspektywy modyfikowalne i niemodyfikowalne, perspektywy wbudowane.

Rozproszone bazy danych Oracle. (c) Politechnika Poznańska, Instytut Informatyki 367

Rozproszone bazy danych 3

Rozszerzenia grupowania

Optymalizacja poleceń SQL

Bazy danych. Plan wykładu. Rozproszona baza danych. Fragmetaryzacja. Cechy bazy rozproszonej. Replikacje (zalety) Wykład 15: Rozproszone bazy danych

Perspektywy zmaterializowane - migawki

Rozproszone bazy danych Oracle

Integracja systemów transakcyjnych

Język SQL. Rozdział 9. Język definiowania danych DDL, część 2.

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

Relacyjne bazy danych. Podstawy SQL

Paweł Rajba

UPDATE Studenci SET Rok = Rok + 1 WHERE Rodzaj_studiow =' INŻ_ST'; UPDATE Studenci SET Rok = Rok 1 WHERE Nr_albumu IN ( '111345','100678');

Widok Connections po utworzeniu połączenia. Obszar roboczy

Bazy danych. dr inż. Arkadiusz Mirakowski

Relacyjne bazy danych. Podstawy SQL

Podstawy języka SQL. SQL Structured Query Languagestrukturalny

I. Język manipulowania danymi - DML (Data Manipulation Language). Polecenia INSERT, UPDATE, DELETE

3 Przygotowali: mgr inż. Barbara Łukawska, mgr inż. Maciej Lasota

Oracle PL/SQL. Paweł Rajba.

Cwiczenie 4. Połączenia, struktury dodatkowe

Wyzwalacz - procedura wyzwalana, składowana fizycznie w bazie, uruchamiana automatycznie po nastąpieniu określonego w definicji zdarzenia

Systemy GIS Tworzenie zapytań w bazach danych

Bazy danych. Bazy danych. Zapytania SELECT. Dr inż. Paweł Kasprowski.

Funkcje analityczne SQL CUBE (1)

Bazy danych - Materiały do laboratoriów VIII

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

AUTOMATYCZNE PRZEPISYWANIE ZAPYTAŃ Z WYKORZYSTANIEM WIDOKÓW ZMATERIALIZOWANYCH W OPTYMALIZACJI OPERACJI W BAZACH DANYCH

Tworzenie widoku CREATE OR REPLACE VIEW [nazwa_widoku] AS SELECT [nazwy_kolumn] FROM [nazwa_tablicy];

Zbiór pytań nr 2. 1 Tabela DEPARTMENTS ma następującą strukturę:

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

Optymalizacja poleceń SQL Wprowadzenie

Optymalizacja. Plan wykonania polecenia SQL (1) Plan wykonania polecenia SQL (2) Rozdział 19 Wprowadzenie do optymalizacji poleceń SQL

Procedury wyzwalane. (c) Instytut Informatyki Politechniki Poznańskiej 1

SQL (ang. Structured Query Language)

Relacji między tabelami klucze obce. Schemat bazy danych, wczytanej z pliku create_tables.sql. Klucz obcy jako ograniczenie dla kolumny

Wydajność hurtowni danych opartej o Oracle10g Database

Wykład IV Modelowanie danych, projektowanie systemu informatycznego Modelowanie konceptualne implementacyjne Modelowanie pojęciowe na encjach

kończy wysyłanie danych do pliku tworzy strukturę tabeli wyświetla opis struktury tabeli zmiana nazwy tabeli usuwanie tabeli

Ćwiczenie 8. Rozproszone bazy danych

Grupowanie i funkcje agregujące

Rozdział 17. Zarządzanie współbieżnością zadania dodatkowe

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

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

Hurtownie danych - przegląd technologii

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

Optymalizacja poleceń SQL

Pakiety podprogramów Dynamiczny SQL

1 Zaznacz poprawne stwierdzenia dotyczące grup plików (filegroup) możemy określić do której grupy plików trafi

Rozproszone bazy danych Oracle

Optymalizacja poleceń SQL Metody dostępu do danych

Zarządzanie obiektami bazy danych Oracle11g

Hurtownie danych - przegląd technologii Robert Wrembel Politechnika Poznańska Instytut Informatyki

1. Wyzwalacze BD (ang. triggers)

Bazy danych wykład szósty Więzy i wyzwalacze. Konrad Zdanowski ( Uniwersytet Kardynała Stefana Bazy danych Wyszyńskiego, wykładwarszawa)

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

Hurtownie danych - przegląd technologii Robert Wrembel Politechnika Poznańska Instytut Informatyki

Hurtownie danych - przegląd technologii

Uprawnienia, role, synonimy

Ile rekordów będzie zawierała tabela przy założeniu, że na początku była pusta?

Tworzenie raportów XML Publisher przy użyciu Data Templates

Wykład 5. SQL praca z tabelami 2

Wykład 8. SQL praca z tabelami 5

Hurtownie danych - przegląd technologii

Kolekcje Zbiory obiektów, rodzaje: tablica o zmiennym rozmiarze (ang. varray) (1) (2) (3) (4) (5) Rozszerzenie obiektowe w SZBD Oracle

Replikacja danych w bazach danych Oracle9i

"Kilka słów" o strojeniu poleceń SQL w kontekście Hurtowni Danych wprowadzenie. Krzysztof Jankiewicz

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

Przykładowa baza danych BIBLIOTEKA

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

Tworzenie tabeli przez select CREATE TABLE PRAC2 AS SELECT P.NAZWISKO, Z.NAZWA FROM PRAC P NATURAL JOIN ZESP Z

Język SQL, zajęcia nr 1

Rozproszone bazy danych Oracle. (c) Politechnika Poznańska, Instytut Informatyki 367

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

Laboratorium Bazy danych SQL 3 1

Język SQL. Rozdział 8. Język manipulowania danymi DML

Rozproszone bazy danych

Przestrzenne bazy danych Podstawy języka SQL

Język PL/SQL. Rozdział 6. Procedury wyzwalane

Zbiór pytań nr 5. 2 Które stwierdzenie opisuje najlepiej zbiór uprawnień dostępny po wykonaniu

Język DML. Instrukcje DML w różnych implementacjach SQL są bardzo podobne. Podstawowymi instrukcjami DML są: SELECT INSERT UPDATE DELETE

Wyzwalacze. do automatycznego generowania wartości kluczy głównych. Składnia instrukcji tworzacej wyzwalacz

SQL DDL DML TECHNOLOGIE BAZ DANYCH. Wykład 5: Język DDL i DML. Małgorzata Krętowska

Bazy danych 10. SQL Widoki

Systemowe aspekty baz

Wykład 05 Bazy danych

Typy Oracle atrybutów relacji Typ NUMBER (1)

Typy Oracle atrybutów relacji Typ NUMBER (1)

Procedury wyzwalane. Rozdział 13. Procedury wyzwalane. Cele stosowania procedur wyzwalanych. Definiowanie procedury wyzwalanej DML

Fazy przetwarzania polecenia SQL. Faza parsingu (2) Faza parsingu (1) Optymalizacja poleceń SQL Część 1.

SQL do zaawansowanych analiz danych część 1.

Transkrypt:

Materializowanie wyników zapytania Cel optymalizacja zapytań analitycznych Mechanizmy Perspektywy zmaterializowane (materialized views) Przepisywanie zapytań (query rewrite) Oprogramowanie Summary Advisor Wymiary (dimensions) summary_emp select depno, avg(sal) from emp group by deptno emp tabela master Odświeżanie perspektyw zmaterializowanych synchroniczne / asynchroniczne pełne / przyrostowe 1

Perspektywa zmaterializowana (1) Definicja zawiera: zapytanie odwołujące się do tabel sposób odświeżania danych (pełne, przyrostowe) częstotliwość odświeżania danych Standardowo tylko do odczytu Implementacja tabela + indeks 2

Perspektywa zmaterializowana (2) Rodzaje (sposób identyfikowania rekordów) PRIMARY KEY tabela master musi posiadać włączone ograniczenie PRIMARY KEY klauzula SELECT musi zawierać wszystkie atrybuty wchodzące w skład klucza podstawowego tabeli master ROWID Rodzaje (struktura zapytania) perspektywa prosta bazująca na jednej tabeli master brak klauzul: GROUP BY, CONNECT BY, DISTINCT brak funkcji, połączeń, operatorów zbiorowych perspektywa złożona 3

Definiowanie perspektywy zmaterializowanej CREATE MATERIALIZED VIEW nazwa BUILD IMMEDIATE DEFERRED REFRESH FAST COMPLETE FORCE ON DEMAND ON COMMIT WITH PRIMARY KEY ROWID START WITH 'data pierwszego odświeżenia' NEXT 'data następnego odświeżenia' AS SELECT...; 4

Przykład CREATE MATERIALIZED VIEW mv_suma_sprzedazy BUILD IMMEDIATE REFRESH FAST NEXT sysdate+(1/(24*60*30)) as select sklep_id, produkt_id, sum(l_sztuk), sum(l_sztuk*cena_jedn), count(l_sztuk), count(l_sztuk*cena_jedn), count(*) from sprzedaz group by sklep_id, produkt_id; 5

Odświeżanie perspektywy zmaterializowanej (2) Sposób odświeżania REFRESH FAST -> odświeżanie przyrostowe REFRESH COMPLETE -> odświeżanie pełne REFRESH FORCE -> automatyczny wybór metody odświeżania; jeżeli możliwe to Oracle wybiera FAST Częstotliwość odświeżania START WITH -> data pierwszego odświeżenia NEXT -> wyrażenie określające częstotliwość odświeżania Odświeżanie automatyczne gdy: wyspecyfikowana klauzula NEXT określona częstotliwość odświeżania REFRESH FAST START WITH sysdate NEXT sysdate+1 REFRESH FAST NEXT sysdate+1 6

Odświeżanie przyrostowe Dla perspektyw prostych Musi istnieć MATERIALIZED VIEW LOG dla tabeli master Perspektywa wyliczająca agregaty: count, sum, avg, variance, stdev dziennik utworzony z klauzulą INCLUDING NEW VALUES dziennik zawiera wszystkie atrybuty wymienione po SELECT, również będące argumentami wywołania funkcji grupowych dla SUM(X), AVG(X) należy wyliczać COUNT(X) i COUNT(*) 7

Odświeżanie perspektywy zmaterializowanej (1) ON COMMIT można stosować jedynie, gdy: zapytanie korzysta z tabel lokalnych migawek opartych o jedną tabelę, bez wyliczania agregatów migawek, których zapytanie wyznacza agregaty w oparciu o pojedynczą tabelę migawek których zapytanie wykorzystuje łączenie tabel, ale bez wyliczania agregatów Uprawnienia wymagane do doświeżania ON COMMIT uprawnienie obiektowe ON COMMIT dla wszystkich tabel, do których odwołuje się perspektywa zmaterializowana uprawnienie systemowe ON COMMIT 8

Odświeżanie perspektywy zmaterializowanej (2) Odświeżanie ręczne, gdy: wyspecyfikowano ON DEMAND brak klauzuli NEXT perspektywa odświeżona raz w momencie jej tworzenia jeśli wyspecyfikowano BUILD IMMEDIATE DBMS_MVIEW.REFRESH ('sn 1, sn 2,..., sn n ', 'metoda') sn 1, sn 2,..., sn n : perspektywy zmaterializowane metoda: metoda odświeżania f lub F: FAST c lub C: COMPLETE?: domyślny DBMS_MVIEW.REFRESH ('s_dept, s_emp, s_emp1', 'C') DBMS_MVIEW.REFRESH ('s_dept, s_emp, s_emp1', 'CF') domyślny 9

Prebuilt table (1) W systemie znajdują się "zwykłe" tabele zawierające dane Zamiana zwykłych tabel na perspektywy zmaterializowane wykorzystanie do przepisywania zapytań klauzula ON PREBUILT TABLE CREATE TABLE monthly_customer_sales ( YEAR NUMBER(4), MONTH NUMBER(2), CUSTOMER_ID VARCHAR2(10), DOLLAR_SALES NUMBER); CREATE MATERIALIZED VIEW monthly_customer_sales ON PREBUILT TABLE ENABLE QUERY REWRITE AS SELECT t.year, t.month, c.customer_id, SUM(f.purchase_price) dollar_sales FROM time t, purchases f, customer c WHERE f.time_key = t.time_key AND f.customer_id = c.customer_id GROUP BY t.year, t.month, c.customer_id; 10

Prebuilt table (2) Nazwa perspektywy zmaterializowanej budowanej na istniejącej tabeli musi być identyczna z nazwą tej tabeli System nie sprawdza poprawności zawartości tabeli w kontekście zapytania definiującego perspektywę tabela może zawierać dane nieodpowiadające zapytaniu Perspektywa będzie odświeżana z wykorzystaniem standardowych mechanizmów, jeśli je zdefiniowano 11

Dziennik perspektywy zmaterializowanej (1) CREATE MATERIALIZED VIEW LOG ON tabela PRIMARY KEY WITH SEQUENCE ROWID PRIMARY KEY, ROWID ROWID (lista kolumn filtrujących) PRIMARY KEY (lista kolumn filtrujących) INCLUDING NEW VALUES EXCLUDING NEW VALUES 12

Dziennik perspektywy zmaterializowanej (2) WITH PRIMARY KEY w dzienniku rejestrowane wartości atrybutów wchodzących w skład klucza WITH ROWID w dzienniku rejestrowane ROWID rekordów WITH PRIMARY KEY, ROWID w dzienniku rejestrowane wartości atr. kluczowych i ROWID WITH SEQUENCE konieczne do odświeżania przyrostowego, gdy do tabeli bazowej są wstawiane rekordy, modyfikowane i usuwane 13

kolumna filtrująca Dziennik perspektywy zmaterializowanej (3) atrybut występujacy w klauzuli WHERE zapytania definiującego perspektywę including new values select sk.nazwa, sk.sklep_id from scott.sklepy where exists (select sp.sklep_id from scott.sprzedaz where sp.sklep_id=sk.sklep_id and sp.produkt_id=100 and sp.data='23.01.2002' and sp.l_sztuk>1) konieczne dla perspektyw odświeżanych przyrostowo zawierających agregaty 14

Przykład CREATE MATERIALIZED VIEW mv_suma_sprzedazy BUILD IMMEDIATE REFRESH FAST NEXT sysdate+(1/(24*60*30)) as select sklep_id, produkt_id, sum(l_sztuk), sum(l_sztuk*cena_jedn), count(l_sztuk), count(l_sztuk*cena_jedn), count(*) from sprzedaz group by sklep_id, produkt_id; CREATE MATERIALIZED VIEW LOG on sprzedaz WITH PRIMARY KEY, ROWID (l_sztuk, cena_jedn) INCLUDING NEW VALUES; 15

EXPLAIN_MVIEW (1) Procedura DBMS_MVIEW.EXPLAIN_MVIEW Analizuje zapytanie definiujące perspektywę i sprawdza, czy perspektywa może być odświeżana przyrostowo W schemacie użytkownika należy uruchomić skrypt %ORACLE_HOME%\rdbms\admin\utlxmv.sql tworzący tabelę MV_CAPABILITIES_TABLE przechowującą wyniki analiz 16

EXPLAIN_MVIEW (2) BEGIN dbms_mview.explain_mview ( 'select sp.rowid sp_rowid, sp.produkt_id, sp.l_sztuk, sk.rowid sk_rowid, sk.nazwa from sprzedaz sp, sklepy sk where sp.sklep_id=sk.sklep_id', 1); END; / statement_id SELECT capability_name, possible, related_text "table", msgtxt explanation FROM MV_CAPABILITIES_TABLE where statement_id='1'; 17

EXPLAIN_MVIEW (3) CAPABILITY_NAME P table EXPLANATION ------------------------------ - --------------- ---------------------------------------------- PCT N REFRESH_COMPLETE Y REFRESH_FAST N REWRITE Y PCT_TABLE N SPRZEDAZ relation is not a partitioned table PCT_TABLE N SKLEPY relation is not a partitioned table REFRESH_FAST_AFTER_INSERT N DEMO.SPRZEDAZ the detail table does not have a materialized vlog REFRESH_FAST_AFTER_ONETAB_DML N see the reason why REFRESH_FAST_AFTER_INSERT is disabled REFRESH_FAST_AFTER_ANY_DML N see the reason why REFRESH_FAST_AFTER_ONETAB_DML is disabled REFRESH_FAST_PCT N PCT is not possible on any of the detail tables in the materialized view REWRITE_FULL_TEXT_MATCH Y REWRITE_PARTIAL_TEXT_MATCH Y REWRITE_GENERAL Y REWRITE_PCT N general rewrite is not possible and PCT is not possible on any of the detail tables 18

Zależności między perspektywami mv_dept dept tabela master 10 ACCOUNTING 20 RESEARCH 30 SALES 40 OPERATIONS mv_emp insert into dept values (50, 'INF.TECHNOLOGY', 'LONDON'); update emp set deptno=50 where ename= BLAKE ; 1 2 tabela master emp 3 exec dbms_mview.refresh('sn_emp', 'f') ename deptno ---------- ---------- BLAKE 50? 19

Grupy odświeżania DBMS_REFRESH.MAKE ( name, list, next_date, interval, implicit_destroy) nazwa grupy lista perspektyw przypisywanych do grupy data następnego odświeżenia okres odświeżania TRUE: usunięcie grupy jeżeli nie zawiera migawek domyślnie FALSE lista perspektyw zmaterializowanych muszą być w tej samej bd mogą być w różnych schematach max. 100 migawek w grupie 20

Przykłady exec DBMS_REFRESH.MAKE (name => 'orc1.rg_dept_emp', - list => 'orc1.sn_dept, orc1.sn_emp', - next_date => sysdate+1/48, - interval => 'next_day(trunc(sysdate), ''FRIDAY'')+10/24', - implicit_destroy => TRUE, - rollback_seg => 'rb1') exec DBMS_REFRESH.ADD ('orc1.rg_dept_emp', orc1.sn_emp1') exec DBMS_REFRESH.SUBTRACT('orc1.rg_dept_emp', 'orc1.sn_emp1') exec DBMS_REFRESH.REFRESH('orc1.rg_dept_emp') exec DBMS_REFRESH.DESTROY('orc1.rg_dept_emp') usuwa grupę z perspektywami lub pustą 21

Informacje słownikowe Zmaterializowane perspektywy USER_MVIEWS Dzienniki zmaterializowanych perspektyw USER_MVIEW_LOGS Informacje nt. odświeżania USER_MVIEW_REFRESH_TIMES Grupy odświeżania USER_REFRESH_CHILDREN Zmaterializowane perspektywy w grupie USER_REFRESH 22

Przepisywanie zapytań ań (1) CREATE MATERIALIZED VIEW nazwa BUILD... WITH... START WITH... NEXT... ENABLE QUERY REWRITE AS SELECT...; 23

Przepisywanie zapytań ań (2) 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 1 0 TABLE ACCESS (FULL) OF 'SUMA_SPRZEDAZY' 24

Przepisywanie zapytań (3)) select nazwa, sum(l_sztuk*cena_jedn) suma from sprzedaz sp, sklepy sk where sp.sklep_id=sk.sklep_id and sk.miasto='poznań' group by nazwa; Execution Plan -------------------------------------------------------- 0 SELECT STATEMENT Optimizer=CHOOSE 1 0 SORT (GROUP BY) 2 1 NESTED LOOPS 3 2 TABLE ACCESS (FULL) OF 'SKLEPY' 4 2 TABLE ACCESS (FULL) OF 'SPRZEDAZ' alter materialized view nazwa_perspektywy {enable disable} query rewrite; 25

Przepisywanie zapytań (4)) Przepisanie zapytania jest możliwe tylko wówczas, gdy: system wykorzystuje optymalizator kosztowy parametr konfiguracyjny instancji OPTIMIZER_MODE=CHOOSE dynamiczny wybór optymalizatora dla sesji alter session set optimizer_mode='choose'; alter session set optimizer_mode='all_rows'; dla tabel bazowych i perspektyw zmaterializowanych zebrano statystyki parametr konfiguracyjny QUERY_REWRITE_ENABLED=TRUE dynamiczne włączenie przepisywania dla sesji alter session set query_rewrite_enabled=true; parametr konfiguracyjny QUERY_REWRITE_ENABLED=FORCE jeżeli istnieje odpowiednia zmaterializowana perspektywa, zostanie wykorzystana do przepisania zapytania niezależnie od tego, czy z jej wykorzystaniem zapytanie zostanie wykonane szybciej, czy wolniej nie jest porównywany koszt wykonania zapytania 26

Przepisywanie zapytań (5) Uprawnienia użytkownika niezbędne do wykorzystania przepisywania zapytań: uprawnienie obiektowe QUERY REWRITE na wszystkich tabelach, do których odwołuje się perspektywa zmaterializowana lub uprawnienie systemowe GLOBAL QUERY REWRITE Techniki przepisywania zapytań text match aggregate rollup join-back filtered data rollup using a dimension Uwaga: perspektywa z operatorem BETWEEN AND wskazującym zakres dat nie będzie wykorzystana do przepisywania zapytań ORA-30353: expression not supported for query rewrite 27

Text match Tekst zapytania perspektywy zmaterializowanej i tekst zapytania użytkownika: są identyczne spacje nie są uwzględniane wielkość liter nie jest uwzględniana kolejność atrybutów/wyrażeń w obu zapytaniach nie ma znaczenia kolejność składników klauzuli WHERE nie ma znaczenia kolejność tabel w klauzuli FROM nie ma znaczenia 28

Aggregate rollup (1) Wynik zapytania użytkownika jest wyznaczany za pomocą agregowania zawartości perspektywy zmaterializowanej create materialized view mv_suma_sprzedazy build immediate refresh force on commit enable query rewrite as select sk.nazwa, pr.prod_nazwa, sum(l_sztuk*cena_jedn), count(l_sztuk) from sprzedaz sp, sklepy sk, produkty pr where sp.sklep_id=sk.sklep_id and sp.produkt_id=pr.produkt_id group by sk.nazwa, pr.prod_nazwa; select sum(l_sztuk*cena_jedn) from sprzedaz sp, sklepy sk, produkty pr where sp.sklep_id=sk.sklep_id and sp.produkt_id=pr.produkt_id; Plan wykonywania ---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=1 Bytes=13) 1 0 SORT (AGGREGATE) 2 1 TABLE ACCESS (FULL) OF 'MV_SUMA_SPRZEDAZY' (Cost=2 Card=82 Bytes=1066) 29

Aggregate rollup (2) select sk.nazwa, sum(l_sztuk*cena_jedn) from sprzedaz sp, sklepy sk, produkty pr where sp.sklep_id=sk.sklep_id and sp.produkt_id=pr.produkt_id group by sk.nazwa; Plan wykonywania ---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=CHOOSE (Cost=4 Card=82 Bytes=2050) 1 0 SORT (GROUP BY) (Cost=4 Card=82 Bytes=2050) 2 1 TABLE ACCESS (FULL) OF 'MV_SUMA_SPRZEDAZY' (Cost=2 Card=Bytes=2050) 30

Join-back (1) Perspektywa zmaterializowana jest łączona z jedną z jej tabel bazowych, w celu wyznaczenia wyników zapytania użytkownika Perspektywa musi zawierać albo klucz podstawowy tej tabeli bazowej lub ROWID rekordów tabeli bazowej create materialized view mv_suma_sprzedazy1 build immediate refresh force next sysdate+(1/(24*60*30)) enable query rewrite as select sp.sklep_id, pr.prod_nazwa, sum(l_sztuk*cena_jedn), count(l_sztuk) from sprzedaz sp, produkty pr where sp.produkt_id=pr.produkt_id group by sp.sklep_id, pr.prod_nazwa; 31

Join-back (2) select sk.nazwa, pr.prod_nazwa, sum(l_sztuk*cena_jedn), count(l_sztuk) from sprzedaz sp, sklepy sk, produkty pr where sp.sklep_id=sk.sklep_id and sp.produkt_id=pr.produkt_id group by sk.nazwa, pr.prod_nazwa; zależność funkcyjna SKLEP_ID NAZWA Execution Plan ---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=CHOOSE (Cost=7 Card=2 Bytes=136) 1 0 SORT (GROUP BY) (Cost=7 Card=2 Bytes=136) 2 1 HASH JOIN (Cost=5 Card=82 Bytes=5576) 3 2 TABLE ACCESS (FULL) OF 'SKLEPY' (Cost=2 Card=2 Bytes=14) 4 2 TABLE ACCESS (FULL) OF 'MV_SUMA_SPRZEDAZY1' (Cost=2 Card=82 Bytes=5002) 32

Join-back (3) Uwaga: jeżeli zawartość klauzuli from zapytania użytkownika i zapytania definiującego perspektywę są inne, to zapytanie może nie zostać przepisane (zależne od wersji Oracle) create materialized view mv_suma_sprzedazy1 build immediate refresh force on commit enable query rewrite as select sp.sklep_id, pr.prod_nazwa, sum(l_sztuk*cena_jedn), count(l_sztuk) from sprzedaz sp, produkty pr where sp.produkt_id=pr.produkt_id group by sp.sklep_id, pr.prod_nazwa; select sk.nazwa, pr.prod_nazwa, sum(l_sztuk*cena_jedn), count(l_sztuk) from sprzedaz sp, produkty pr, sklepy sk where sp.produkt_id=pr.produkt_id and sp.sklep_id=sk.sklep_id group by sk.nazwa, pr.prod_nazwa; 33

Filtered data (1) create materialized view mv_suma_sprzedazy3 build immediate refresh force on commit enable query rewrite as select sp.sklep_id, pr.prod_nazwa, sum(l_sztuk*cena_jedn), count(l_sztuk) from sprzedaz sp, sklepy sk, produkty pr where sp.sklep_id=sk.sklep_id and sp.produkt_id=pr.produkt_id and sk.sklep_id in (1, 2) group by sp.sklep_id, pr.prod_nazwa; select sp.sklep_id, pr.prod_nazwa, sum(l_sztuk*cena_jedn), count(l_sztuk) from sprzedaz sp, sklepy sk, produkty pr where sp.sklep_id=sk.sklep_id and sp.produkt_id=pr.produkt_id and sk.sklep_id=2 group by sp.sklep_id, pr.prod_nazwa; Execution Plan ---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=2 Bytes=28) 1 0 TABLE ACCESS (FULL) OF 'MV_SUMA_SPRZEDAZY3' (Cost=2 Card=2 Bytes=28) 34

Filtered data (2) Wyliczanie dodatkowych agregatów, np. AVG, na podstawie perspektywy zmaterializowanej create materialized view mv_suma_sprzedazy4 build immediate refresh force on commit enable query rewrite muszą wystąpić identyczne atrybuty/wyrażenia as select sp.sklep_id, pr.prod_nazwa, sum(l_sztuk*cena_jedn), count(l_sztuk*cena_jedn) from sprzedaz sp, sklepy sk, produkty pr where sp.sklep_id=sk.sklep_id and sp.produkt_id=pr.produkt_id and sk.sklep_id in (1, 2) group by sp.sklep_id, pr.prod_nazwa; select sk.nazwa, pr.prod_nazwa, avg(l_sztuk*cena_jedn) from sprzedaz sp, sklepy sk, produkty pr where sp.sklep_id=sk.sklep_id and sp.produkt_id=pr.produkt_id and sk.sklep_id=2 group by sk.nazwa, pr.prod_nazwa; 35

Filtered data (3) Wyliczenie AVG(x) w zapytaniu użytkownika będzie możliwe jeśli perspektywa zmaterializowana będzie zawierała SUM(x) i COUNT(x) Execution Plan ---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=CHOOSE (Cost=5 Card=1 Bytes=55) 1 0 SORT (GROUP BY) (Cost=5 Card=1 Bytes=55) 2 1 NESTED LOOPS (Cost=3 Card=2 Bytes=110) 3 2 TABLE ACCESS (BY INDEX ROWID) OF 'SKLEPY' (Cost=1 Card=1 Bytes=7) 4 3 INDEX (UNIQUE SCAN) OF 'SKLEPY_PK' (UNIQUE) 5 2 TABLE ACCESS (FULL) OF 'MV_SUMA_SPRZEDAZY4' (Cost=2 Card=2 Bytes=96) 36

Rollup using dimension (1) create table czas (data date CONSTRAINT czas_pk PRIMARY KEY, nr_dnia_mies number (2,0), nr_mies number (2,0), nr_kwart number (2,0), rok number (4,0), nr_dnia_roku number (3,0), dzien_tyg varchar2(12), nr_tyg number (2,0)); create materialized view mv_suma_sprzedazy5 build immediate refresh force on commit enable query rewrite as select pr.prod_nazwa, cz.nr_mies, sum(l_sztuk*cena_jedn), count(l_sztuk*cena_jedn) from sprzedaz sp, produkty pr, czas cz where sp.produkt_id=pr.produkt_id and sp.data=cz.data group by pr.prod_nazwa, cz.nr_mies; create dimension CZAS level l_data is czas.data level l_mies is czas.nr_mies level l_kwart is czas.nr_kwart level l_rok is czas.rok HIERARCHY czas_hier ( l_data child of l_mies child of l_kwart child of l_rok); 37

Rollup using dimension (2) Należy ustalić wartość parametru QUERY_REWRITE_INTEGRITY na TRUSTED lub STALE_TOLERATED alter session set QUERY_REWRITE_INTEGRITY='TRUSTED'; select pr.prod_nazwa, cz.rok, sum(l_sztuk*cena_jedn) from sprzedaz sp, produkty pr, czas cz where sp.produkt_id=pr.produkt_id and sp.data=cz.data Execution Plan group by pr.prod_nazwa, cz.rok; ---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=CHOOSE (Cost=13 Card=2 Bytes=92) 1 0 SORT (GROUP BY) (Cost=13 Card=2 Bytes=92) 2 1 HASH JOIN (Cost=8 Card=682 Bytes=31372) 3 2 TABLE ACCESS (FULL) OF 'MV_SUMA_SPRZEDAZY5' (Cost=2 Card=5 Bytes=100) 4 2 VIEW (Cost=5 Card=409 Bytes=10634) 5 4 SORT (UNIQUE) (Cost=5 Card=409 Bytes=10634) 6 5 TABLE ACCESS (FULL) OF 'CZAS' (Cost=2 Card=409 Bytes=10634) 38

Rollup using dimension (3) Wykorzystanie zależności funkcyjnych między atrybutami tabeli, zdefiniowanych w wymiarze create table sklepy (sklep_id number(3), nazwa varchar2(20) not null, rodzaj_sklepu varchar2(10) not null, miasto varchar2(15) not null, wojewodztwo varchar2(30) not null); create materialized view mv_suma_sprzedazy6 build immediate refresh force on commit enable query rewrite as create dimension SKLEPY level l_sklep is sklepy.sklep_id level l_miasto is sklepy.miasto level l_wojew is sklepy.wojewodztwo HIERARCHY sklepy_hier ( l_sklep child of l_miasto child of l_wojew) ATTRIBUTE l_sklep DETERMINES (rodzaj_sklepu); select sk.sklep_id, sum(l_sztuk*cena_jedn), count(l_sztuk*cena_jedn) from sprzedaz sp, sklepy sk where sp.sklep_id=sk.sklep_id group by sk.sklep_id; 39

Rollup using dimension (4) select sk.rodzaj_sklepu, sum(l_sztuk*cena_jedn) from sprzedaz sp, sklepy sk where sp.sklep_id=sk.sklep_id Execution Plan group by sk.rodzaj_sklepu; ---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=CHOOSE (Cost=6 Card=2 Bytes=30) 1 0 SORT (GROUP BY) (Cost=6 Card=2 Bytes=30) 2 1 NESTED LOOPS (Cost=4 Card=2 Bytes=30) 3 2 TABLE ACCESS (FULL) OF 'MV_SUMA_SPRZEDAZY6' (Cost=2 Card=2 Bytes=8) 4 2 TABLE ACCESS (BY INDEX ROWID) OF 'SKLEPY' (Cost=1 Card=1 Bytes=11) 5 4 INDEX (UNIQUE SCAN) OF 'SKLEPY_PK' (UNIQUE) Uwaga: jeżeli tabela SPRZEDAZ będzie posiadała klucz podstawowy, to powyższe zapytanie zostanie również przepisane nawet jeśli nie zdefiniowano zależności funkcyjnych w wymiarze 40

QUERY_REWRITE_INTEGIRTY (1) Parametr określający jakie perspektywy zmaterializowane, ograniczenia integralnościowe i obiekty typu DIMENSION zostaną wykorzystane do przepisywania zapytań Modyfikowany dla całej instancji lub sesji Dopuszczalne wartości ENFORCED (wartość domyślna) Oracle zapewnia, że wynik zapytania przepisanego będzie identyczny z wynikiem oryginalnego zapytania na tabelach bazowych Sprawdza poprawność danych weryfikując za każdym razem ograniczenia integralnościowe Nie wykorzystuje obiektów typu DIMENSION STALE_TOLERATED Oracle wykorzysta perspektywy zmaterializowane, których zawartość albo nie jest aktualna albo nie odzwierciedla (zagregowanych) danych z tabel bazowych (dla perspektyw modyfikowalnych) 41

QUERY_REWRITE_INTEGIRTY (2) TRUSTED (zalecany w magazynach danych) pod warunkiem, że integralność danych zostanie zapewniona przez oprogramowanie zarządzające magazynem (również aplikacje) Oracle wykorzysta: obiekty typu DIMENSION ograniczenia integralnościowe oznaczone jako poprawne RELY ALTER TABLE nazwa MODIFY CONSTRAINT nazwa_ogr RELY; perspektywy zbudowane w oparciu o istniejące tabele (ON PREBUILT TABLE) tylko te perspektywy zmaterializowane, które zawierają dane aktualne Uwaga: jeżeli zapytanie nie zostanie przepisane w trybie STALE_TOLERATED, to w innych trybach na pewno nie zostanie przepisane Określenie aktualności danych zmaterializowanej perspektywy USER_MVIEWS.STALENESS wartości FRESH lub STALE (NEEDS_COMPILE) 42

Warunki niezbędne do przepisania zapytania - podsumowanie Uprawnienia użytkownika: uprawnienie obiektowe QUERY REWRITE na wszystkich tabelach, do których odwołuje się perspektywa zmaterializowana lub uprawnienie systemowe GLOBAL QUERY REWRITE Włączony mechanizm przepisywania zapytań dla perspektywy zmaterializowanej klauzula ENABLE QUERY REWRITE lub włączenie dynamicznie (alter materialized view) Włączony mechanizm przepisywania w systemie parametr konfiguracyjny QUERY_REWRITE_ENABLED=TRUE lub włączenie dynamicznie dla sesji (alter session) Wykorzystywany optymalizator kosztowy OPTIMIZER_MODE=CHOOSE (parametr konfiguracyjny, ustawienie dla sesji) dla tabel bazowych i perspektyw zmaterializowanych zebrano statystyki QUERY_REWRITE_INTEGRITY= ENFORCED STALE_TOLERATED TRUSTED (parametr konfiguracyjny, ustawienie dla sesji) 43

Wskazówki optymalizatora zapytań REWRITE (nazwa_perspektywy) NOREWRITE select /*+ REWRITE(MV_SUMA_SPRZEDAZY6) */ sk.sklep_id, sum(l_sztuk*cena_jedn) from sprzedaz sp, sklepy sk where sp.sklep_id=sk.sklep_id group by sk.sklep_id; select /*+ NOREWRITE */ sk.sklep_id, sum(l_sztuk*cena_jedn) from sprzedaz sp, sklepy sk where sp.sklep_id=sk.sklep_id group by sk.sklep_id; Uwaga: jeżeli we wskazówce REWRITE podamy perspektywę, której nie da się wykorzystać do przepisania zapytania, to optymalizator wybierze perspektywę właściwą 44

GROUPING SETS (1) create materialized view mv_suma_sprzedazy7 build immediate refresh force next sysdate+(1/(24*60*30)) enable query rewrite as Perspektywa zmaterializowana musi zawierać funkcję GROUPING lub GROUPING_ID, w przeciwnym przypadku zapytanie nie zostanie przepisane select sk.nazwa, pr.prod_nazwa, cz.rok, sum(l_sztuk*cena_jedn), count(l_sztuk), GROUPING_ID(sk.nazwa, pr.prod_nazwa, cz.rok) from sprzedaz sp, sklepy sk, produkty pr, czas cz where sp.sklep_id=sk.sklep_id and sp.produkt_id=pr.produkt_id and sp.data=cz.data group by GROUPING SETS ((sk.nazwa, pr.prod_nazwa), (pr.prod_nazwa, cz.rok)); select sk.nazwa, pr.prod_nazwa, sum(l_sztuk*cena_jedn), count(l_sztuk) from sprzedaz sp, sklepy sk, produkty pr where sp.sklep_id=sk.sklep_id and sp.produkt_id=pr.produkt_id group by GROUPING SETS ((sk.nazwa, pr.prod_nazwa)); 45

Procedura EXPLAIN_REWRITE Analizuje możliwość przepisania zapytania w oparciu o wskazaną perspektywę zmaterializowaną Wynik analizy w tabeli REWRITE_TABLE należy ją utworzyć w schemacie użytkownika skrypt ORACLE_HOME\rdbms\admin\utlxrw.sql BEGIN DBMS_MVIEW.EXPLAIN_REWRITE ('select sk.nazwa, pr.prod_nazwa, sum(l_sztuk*cena_jedn), count(l_sztuk) from sprzedaz sp, sklepy sk, produkty pr where sp.sklep_id=sk.sklep_id and sp.produkt_id=pr.produkt_id group by GROUPING SETS ((sk.nazwa, pr.prod_nazwa))', 'MV_SUMA_SPRZEDAZY7'); END; select mv_name, message from rewrite_table; MV_NAME MESSAGE -------------------- ------------------------------------------------- MV_SUMA_SPRZEDAZY7 QSM-01033: query rewritten with materialized view, MV_SUMA_SPRZEDAZY7 46