Hurtownie Danych i Przetwarzanie Analityczne

Data Warehouses and Analytical Processing


dr hab. inż. Robert Wrembel, prof. nadzw.

Partycjonowanie danych: zadania


Zad.1.
Utworzyć tabelę PURCHASES partycjonowaną zakresowo, z czterema partycjami. Schemat PURCHASES przedstawiono poniżej. Pierwsze trzy partycje PURCHASES mają przechowywać dane o sprzedaży odpowiednio: w styczniu 2002, lutym 2002 i marcu 2002. Czwarta partycja ma przechowywać pozostałe dane o sprzedaży. Atrubutem partycjonoującym jest purchase_date.
Uwaga 1: zakładamy, że w hurtowni danych nie będą przechowywane dane wcześniejsze niż ze stycznia 2002.
Uwaga 2: należy zwrócić uwagę na domyślny format daty.

PURCHASES
Name                Null?    Type
------------------- -------- ------------
PRODUCT_ID          NOT NULL VARCHAR2(8)
TIME_KEY            NOT NULL DATE
CUSTOMER_ID         NOT NULL VARCHAR2(10)
PURCHASE_DATE                DATE
PURCHASE_TIME                NUMBER(4)
PURCHASE_PRICE               NUMBER(6,2)
SHIPPING_CHARGE              NUMBER(5,2)
STATE_ID                     VARCHAR2(2)
TODAY_SPECIAL_OFFER          VARCHAR2(1)

Utworzyć indeks lokalny, jak niżej i wyświetlić informacje o partycjach tego indeksu. Następnie usunąć ten indeks.
create index purchases_local_indx
on purchases(purchase_date)
local; 

Utworzyć indeks lokalny, jak niżej i wyświetlić informacje o partycjach tego indeksu. Następnie usunąć ten indeks.
create index purchases_local_indx
on purchases(purchase_date)
local
(partition indx_purch_jan2002, 
 partition indx_purch_feb2002, 
 partition indx_purch_mar2002,
 partition indx_purch_apr2002); 

Zad.2.
Dodać do tabeli PURCHASES nową partycję przechowującą rekordy sprzedaży z kwetnia 2002.

Zad.3.
Utworzyć tabelę PURCHASES1 partycjonowaną haszowo, z trzema partycjami. Kluczem partycjonującym jest atrybut PRODUCT_ID. PURCHASES1 posiada identyczny schemat jak tabela PURCHASES.

Zad.4.
Utworzyć tabelę REGIONAL_SALES partycjonowaną listowo. Schemat REGIONAL_SALES przedstawiono poniżej. Tabela ma posiadać 6 partycji, których atrybutem partycjonującym jest STATE. Nazwy poszczególnych partycji i zbiory wartości atrybutu STATE przedstawiono poniżej.

NORTHEAST -> 'NH', 'VT', 'MA', 'RI', 'CT'
SOUTHEAST -> 'NC', 'GA', 'FL'
NORTHWAST -> 'WA', 'OR'
MIDWEST -> 'IL', 'WI', 'OH'
WEST -> 'CA', 'NV', 'AZ'
OTHERSTATES -> pozostałe

REGIONAL_SALES
Name            Null?    Type
--------------- -------- ------------
STATE           NOT NULL VARCHAR2(2)
STATE_NAME      NOT NULL VARCHAR2(20)
PRODUCT_ID      NOT NULL VARCHAR2(8)
PRODUCT_SALE    NOT NULL NUMBER(8)

Zad.5.
Utworzyć indeks globalny bez perfiksu na atrybucie PURCHASES.PRODUCT_ID. Indeks ma być podzielony na trzy partycje. Pierwsza o wartościach PRODUCT_ID < 'SP1000', druga o wartościach PRODUCT_ID < 'SP2000', a trzecia o wartościach PRODUCT_ID >='SP2000'.

Zad.6.
Utworzyć tabelę PURCHASES_JAN2002 jako kopię tabeli wrembel_r.PURCHASES (wykorzystać polecenie create table as select), zawierającą wyłącznie dane o sprzedaży ze stycznia 2002 (atrybut purchase_date).
Wymienić dane między tabelą PURCHASES_JAN2002, a partycją tabeli PURCHASES przechowującą dane ze stycznia 2002 (utworzoną w ćwiczeniu 1).

Zad.7.
Wczytać do tabeli PURCHASES dane o sprzedaży w lutym 2002. Źródłem danych jest tabela wrembel_r.PURCHASES. Odczytać zawartość partycji przechowującej dane z lutego.

Zad.8.
Obserwacja planów wykonania zapytań.
Korzystając z polecenia set autotrace traceonly explain włączyć wyświetlanie planów zapytań.

Wykonać poniższe zapytania i zaobserować różnicę w planach ich wykonania.
select * from purchases where purchase_date > '31-01-2002';
select * from purchases where purchase_date < '31-01-2002';

Zad.9.
Utworzyć tabelę Products_Part, o schemacie przedstawionym poniżej, partycjonowaną listowo z trzema partycjami: pierwsza przechowuje produkty kateogrii 'HDRW', druga - 'ELEC', a trzecia - 'MUSC'.

product_id             varchar2(8) PRIMARY KEY
product_name           varchar2(30)
category               varchar2(4)
cost_price             number (6,2)
sell_price             number (6,2)
weight                 number (4,2)
shipping_charge        number (5,2)
manufacturer           varchar2(20)
supplier               varchar2(10)

Wczytać dane do Products_Part z tabeli wrembel_r.PRODUCT.

Utworzyć tabelę Sales_Part_Prod, o schemacie przedstawionym poniżej, partycjonowaną referencyjnie, tak, aby podział na partycje odpowiadał podziałowi na partycje tabeli Products_Part.

product_id             varchar2(8) FK -> Products_Part(product_id)
time_key               date
customer_id            varchar2(10)
purchase_date          date
purchase_time          number(4,0)
purchase_price         number(6,2)
shipping_charge        number(5,2)
state_id               varchar2(2)
today_special_offer    varchar2(1)

Uwaga: poprawnie zdefiniować ograniczenie integralnościowe klucza obcego.

Sprawdzić jakie partycje posiada tabela Sales_Part_Prod.

Wczytać z tabeli wrembel_r.PURCHASES dane do tabeli Sales_Part_Prod i sprawdzić ile rekordów znajduje się w każdej z partycji.

Zad.11.
Zbadać plany wykonania następujących zapytań.

select product_name, count(1) 
from Products_Part p, Sales_Part_Prod s
where p.product_id=s.product_id
and p.category='ELEC'
group by product_name;

select product_name, count(1) 
from Products_Part p, Sales_Part_Prod s
where p.product_id=s.product_id
group by product_name;

Zebrać statystyki dla obu tabel i powtórzyć zapytania. Szablon polecenia zbierającego statystyki:

EXEC DBMS_STATS.gather_table_stats('nazwa-uzytk', 'nazwa-tabeli', estimate_percent 
=> DBMS_STATS.auto_sample_size);

Zad.12.
Korzystając ze słownika bazy danych wyświetlić informacje o wszystkich partycjach tabeli PURCHASES i partycjonowanych indeksach.

Zad.13.
Utworzyć tabelę Sales_Dyn_Part o poniższym schemacie, z dynamicznymi partycjami, z których każda przechowuje dane z jednego miesiąca. Warunek less than niech przyjmuje wartość pierwszego dnia bieżącego miesiąca.

Name                Null?    Type
------------------- -------- ------------
PRODUCT_ID          NOT NULL VARCHAR2(8)
PURCHASE_DATE                DATE
QUANTITY                     NUMBER(3)

Wstawić do Sales_Dyn_Part kilka rekordów testowych z datami z różnych miesięcy. Sprawdzić w słowniku bazy danych czy i jakie partycje są tworzone dla tej tabeli.