Optymalizacja zapytań, perspektywy zmaterializowane, Access Advisor

 

1. Utwórz schemat relacji do ćwiczeń, wykonując skrypt.

 

2. Utwórz perspektywę materializowaną o nazwie PURCHASES_SUM_MV, która będzie przechowywała zagregowane dane o sumarycznej kwocie (PURCHASE_PRICE) i ilości sprzedanych produktów (PRODUCT_ID). Perspektywa powinna wykorzystywać tylko tabelę PURCHASES.

 

Parametry odświeżania perspektywy to:

 

Sprawdź w słowniku danych informacje o:

 

Odczytaj zawartość perspektywy.

 

3. Spróbuj dokonać ręcznego odświeżenia perspektywy PURCHASES_SUM_MV w trybie FAST (wykorzystaj procedurę DBMS_MVIEW.REFRESH). Co zaobserwowałaś/eś?

 

4. Zdefiniuj perspektywę materializowaną PURCHASES_SUM_FAST_MV, udostępniającą te same informacje, co perspektywa PURCHASES_SUM_MV. Zdefiniuj tą perspektywę w taki sposób, aby było możliwe odświeżanie przyrostowe. Udowodnij poprawność działania perspektywy odświeżając ją ręcznie w trybie FAST.

 

5. Utwórz tabelę PURCHASES_AVG o następującej stukturze:

 

- PRODUCT_ID            varchar2(8) not null

- AVG_PURCHASE_PRICE    number

 

Wypełnij tabelę PURCHASES_AVG danymi nt. średniej ceny sprzedaży produktów (wykorzystaj polecenie CREATE TABLE ... AS SELECT). Następnie dokonaj transformacji tej tabeli do perspektywy materializowanej (użyj opcji ON PREBUILT TABLE). Spróbuj dokonać modyfikacji danych w PURCHASES_AVG. Następnie usuń perspektywę PURCHASES_AVG. Co się dzieje z wcześniej utworzoną tabelą?

 

6. Sprawdź, czy zapytanie:

 

SELECT t.year, t.month, p.product_id,

             sum (ps.purchase_price) as sum_of_sales,

       count (ps.purchase_price) as total_sales

FROM time t, product p, purchases ps

WHERE t.time_key = ps.time_key AND

            ps.product_id = p.product_id

GROUP BY t.year, t.month, p.product_id;

 

może służyć jako zapytanie definiujące perspektywę zmaterializowaną odświeżaną przyrostowo? Użyj procedury DBMS_MVIEW.EXPLAIN_MVIEW. Przygotuj najpierw środowisko – utwórz tabelę MV_CAPABILITIES_TABLE (skrypt utlxmv.sql).

 

7. Przygotuj środowisko do następnych zadań. Utwórz tabelę PLAN_TABLE (skrypt utlxplan.sql). Uwaga, nie we wszystkich wersjach Oracle tabela ta jest potrzebna w schemacie każdego użytkownika; szczegółowych informacji udziela prowadzący zajecia.

 

Przydatne polecenia:

 

8. Utwórz taką perspektywę zmaterializowaną, która zostanie wykorzystana do przepisania każdego z poniższych zapytań. Zweryfikuj działanie mechanizmu przepisywania dla zaproponowanej perspektywy. Nie zapomnij o zebraniu statystyk dla tabel.

 

SELECT t.year, t.month, p.product_id,

       sum (ps.purchase_price) as sum_of_sales,

       count (ps.purchase_price) as total_sales

FROM time t, product p, purchases ps

WHERE t.time_key = ps.time_key AND

      ps.product_id = p.product_id

GROUP BY t.year, t.month, p.product_id;

 

SELECT t.month, t.year, p.product_id,

       AVG(ps.purchase_price) avg_of_sales

FROM time t, product p, purchases ps

WHERE t.time_key = ps.time_key AND

      ps.product_id = p.product_id

GROUP BY t.year, t.month, p.product_id;

 

SELECT t.year, p.product_id,

       SUM (ps.purchase_price) as sum_of_sales,

       COUNT (ps.purchase_price) as total_sales

FROM time t, product p, purchases ps

WHERE t.time_key = ps.time_key AND

      ps.product_id = p.product_id

GROUP BY t.year, p.product_id;

 

SELECT t.year, t.month, p.product_name,

       SUM (ps.purchase_price) as sum_of_sales

FROM time t, product p, purchases ps

WHERE t.time_key = ps.time_key AND

      ps.product_id = p.product_id

GROUP BY t.year, t.month, p.product_name;

 

9. Dane są: perspektywa zmaterializowana CUST_SALES_MV (jak niżej) i przykładowe zapytanie.

 

CREATE MATERIALIZED VIEW cust_sales_mv

ENABLE QUERY REWRITE

AS

SELECT c.customer_id, SUM(ps.purchase_price) as sum_of_sales,

COUNT (ps.purchase_price) as total_sales

FROM customer c, purchases ps

WHERE c.customer_id = ps.customer_id

GROUP BY c.customer_id;

 

SELECT c.occupation, SUM(ps.purchase_price) as sum_of_sales

FROM purchases ps, customer c

WHERE c.customer_id = ps.customer_id

GROUP BY c.occupation;

 

a)       sprawdź, czy plan wykonania zapytania wykorzystuje perspektywę

b)       usuń definicję klucza podstawowego tabeli CUSTOMER i powtórz podpunkt a)

c)       zdefiniuj obiekt typu wymiar, który powinien ponownie umożliwić wykorzystanie perspektywy przy wykonaniu zapytania

 

10. Utwórz perspektywę zmaterializowaną SALES_MV, której definicję przedstawiono poniżej. Zmodyfikuj zawartość tabeli PURCHASES i zatwierdź transakcję. Sprawdź aktualność danych perspektywy SALES_MV (kolumna STALENESS perspektywy USER_MVIEWS).

 

CREATE MATERIALIZED VIEW SALES_MV

BUILD IMMEDIATE

REFRESH FORCE

ON DEMAND

ENABLE QUERY REWRITE

AS

SELECT SUM (purchase_price), state_id

FROM purchases

GROUP BY state_id;

 

Następnie wykonaj poniższe polecenia i wyciągnij wnioski.

 

ALTER SESSION SET QUERY_REWRITE_INTEGRITY=STALE_TOLERATED;

 

SELECT SUM (purchase_price), state_id

FROM purchases

GROUP BY state_id;

 

ALTER SESSION SET QUERY_REWRITE_INTEGRITY=ENFORCED;

 

SELECT SUM (purchase_price), state_id

FROM purchases

GROUP BY state_id;

 

Co należy zrobić, aby perspektywa SALES_MV była znowu używana przy przepisywaniu zapytań w trybie poziomu integralności ENFORCED?

 

11. Utwórz perspektywę zmaterializowaną SALES_CPGT, której definicję przedstawiono poniżej. Zapewnij, aby poniższe zapytanie było przepisywane w oparciu o perspektywę SALES_CPGT.

 

create materialized view SALES_CPGT

enable query rewrite

as

select c.customer_id, p.category, t.month, g.state_name,

       sum(pu.purchase_price)

from customer c, product p, time t, geography g, purchases pu

where pu.product_id=p.product_id

and pu.time_key=t.time_key

and pu.customer_id=c.customer_id

and pu.state_id=g.state_id

group by c.customer_id, p.category, t.month, g.state_name;

 

select c.county, p.category, t.quarter, g.state_name,

       sum(pu.purchase_price)

from customer c, product p, time t, geography g, purchases pu

where pu.product_id=p.product_id

and pu.time_key=t.time_key

and pu.customer_id=c.customer_id

and pu.state_id=g.state_id

group by c.county, p.category, t.quarter, g.state_name;

 

12. Korzystając z Access Advisor, uzyskaj rekomendacje dot. indeksów i perspektyw zmaterializowanych optymalizujących zbiór poniższych zapytań analitycznych.

 

select c.county, p.category, t.quarter, sum(pu.purchase_price)

from customer c, product p, time t, purchases pu

where pu.product_id=p.product_id

and pu.time_key=t.time_key

and pu.customer_id=c.customer_id

group by rollup (c.county, p.category, t.quarter);

 

select g.region, p.category, t.year,

     sum(pu.purchase_price), sum(pu.shipping_charge)

from geography g, product p, time t, purchases pu

where pu.state_id=g.state_id

and pu.product_id=p.product_id

and pu.time_key=t.time_key

group by g.region, p.category, t.year;

 

select g.region, p.category, sum(pu.purchase_price)

from geography g, product p, purchases pu

where pu.state_id=g.state_id

and pu.product_id=p.product_id

group by g.region, p.category;

 

13. Zdefiniować obciążenie zawierające wszystkie zapytania z SQL Cache użytkownika, z którego korzystamy wykonując ćwiczenia. Wyświetlić treść wczytanych zapytań.