Zarządzanie obiektami bazy danych Oracle...
Transcript of Zarządzanie obiektami bazy danych Oracle...
Zarządzanie obiektami bazy danych Oracle 11g
Strona: 1 | Administracja bazą Oracle 11g | Studia Podyplomowe SGGW | Laboratorium nr 7 i 8
Zarządzanie obiektami bazy danych Oracle11g
Wstęp Kontynuując ćwiczenia dotyczące obiektów w bazie Oracle, na dzisiejszych zajęciach zajmiemy sie:
Indeksami
Technologią Flashback
Indeksy Indeksy to struktury, które zakłada się na kolumny w tabelach w celu:
przyspieszenia wyszukiwania, a więc operacji SELECT
implementacji więzów integralności typu PRIMARY KEY oraz UNIQUE.
Każde zapytanie do bazy danych w którym uwzględniony jest warunek związany z wartością kolumny
wymaga sprawdzenia tego warunku dla każdego wiersza. Poniższe polecenie:
SELECT * FROM EMPLOYEES WHERE SALARY > 1000 AND SALARY < 50000;
filtruje wiersze po kolumnie SALARY. W przypadku braku indeksu na kolumnie SALARY, baza danych
musi przejrzeć wszystkie wiersze w tabeli (bez względu na ich ilość) aby przygotować wynik. Takie pełne
przejrzenie tabeli jest nazywane FULL TABLE SCAN i jest bardzo nieefektywne. Jeśli tabela będzie miała
miliony rekordów to każde tego typu zapytanie będzie zajmować dużo czasu.
Typowy indeks jest strukturą drzewiastą w postaci B-drzewa (B-Tree) w której znacznie szybciej można
odnaleźć wartości zgodne z warunkiem w klauzuli WHERE.
Innym rodzajem indeksu jest indeks bitmapowy (Bitmap index), który jest używany na kolumnach z niską
kardynalnością wartości, a więc z ich dużą powtarzalnością. Przyjmuje się, że unikalnych wartości w
kolumnie w całej tabeli nie powinno być więcej niż 100. Im mniej unikalnych wartości tym lepsze
wykorzystanie indeksu i większy wpływ na wydajność. Dobrym przykładem zastosowania indeksu
bitmapowego są kolumny przyjmujące z założenie tylko kilka wartości np. Płeć: [K, M].
Oto przykłady tworzenia różnych rodzajów indeksów:
CREATE INDEX EMP_SAL_IDX ON EMPLOYEES (SALARY) TABLESPACE INDEX_TS;
Normalny indeks w postaci B-drzewa na tabeli EMPLOYEES i kolumnie SALARY utworzony w przestrzeni
tabel INDEX_TS
CREATE INDEX EMP_NAME_IDX ON EMPLOYEES (FIRST_NAME, LAST_NAME);
Zarządzanie obiektami bazy danych Oracle 11g
Strona: 2 | Administracja bazą Oracle 11g | Studia Podyplomowe SGGW | Laboratorium nr 7 i 8
Indeks na tabeli EMPLOYEES założony jednocześnie na dwóch kolumnach
CREATE BITMAP INDEX EMP_SEX_IDX ON EMPLOYEES (SEX);
Indeks bitmapowy założony na kolumnie SEX (Płeć)
Informację o istniejących indeksach można znaleźć w perspektywach
USER_INDEXES – dla zwykłego użytkownika, pokazujące tylko indeksy użytkownika
DBA_INDEXES – dla administratora, pokazujące wszystkie indeksy
Analizowanie i przebudowywanie indeksów Indeksy przebudowuje się od czasu do czasu ponieważ ciągłe usuwanie, aktualizacje i nowe rekordy w
tabeli mogą spowodować, że struktura indeksu będzie nieoptymalna. Może nawet zdarzyć się taka
sytuacja, że indeks będzie zajmował więcej miejsca niż sama tabela. W takiej sytuacji przebudowanie
indeksu wydaje się być najlepszym rozwiązaniem.
Decyzję o przebudowie indeksu można oprzeć o statystyki, które zbiera się poleceniem
ANALYZE INDEX. Są dwie opcje do analizowania indeksu:
Standardowa analiza indeksu poleceniem ANALYZE INDEX COMPUTE STATISTICS, która wpisuje
wyniki analizy w perspektywę DBA_INDEXES
Analiza wewnętrznej struktury i wyliczenie statystyk poleceniem ANALYZE INDEX VALIDATE
STRUCTURE, który generuje statystyki do perspektywy INDEX_STATS. Uwaga! Perspektywa
INDEX_STATS zawiera maksymalnie jeden wiersz wpisywany w wyniku wykonania polecenia
ANALYZE INDEX VALIDATE STRUCTURE. Ponowne wykonanie tego polecenia nadpisuje
poprzedni wpis w INDEX_STATS.
Przykłady:
1. Analiza indeksu i sprawdzenie parametrów w DBA_INDEXES lub USER_INDEXES
ANALYZE INDEX EMP_SAL_IDX COMPUTE STATISTICS;
ANALYZE INDEX EMP_SAL_IDX ESTIMATE STATISTICS;
SELECT
BLEVEL, LEAF_BLOCKS, DISTINCT_KEYS, AVG_LEAF_BLOCKS_PER_KEY,
AVG_DATA_BLOCKS_PER_KEY
FROM USER_INDEXES
WHERE INDEX_NAME=’EMP_SAL_IDX’;
2. Analiza indeksu i jego wewnętrznej struktury. Podgląd wyników w INDEX_STATS
ANALYZE INDEX EMP_SAL_IDX VALIDATE STRUCTURE;
SELECT HEIGHT, BLOCKS, USED_SPACE, DEL_LF_ROWS FROM INDEX_STATS;
Przyjmuje się zasadę, że jeśli indeks ma wysokość większą niż 4 oraz usuniętych liści jest ponad 10%
(niektóre źródła podają 20%) to należy przebudować indeks.
Zarządzanie obiektami bazy danych Oracle 11g
Strona: 3 | Administracja bazą Oracle 11g | Studia Podyplomowe SGGW | Laboratorium nr 7 i 8
ALTER INDEX EMP_SAL REBUILD TABLESPACE INDEX_TS;
Powyższe polecenie przebudowuje indeks (usuwa i zakłada nowy) i umieszcza w przestrzeni tabel
INDEX_TS;
Aby usunąć indeks należy posłużyć się poleceniem DROP INDEX np.
DROP INDEX EMP_SAL_IDX;
Informacje o indeksach można znaleźć w perspektywie systemowej ALL_INDEXES lub DBA_INDEXES.
Poniższe zapytanie wyświetla wszystkie indeksy założone na tabeli EMPLOYEES:
SELECT INDEX_NAME, INDEX_TYPE, UNIQUENESS, BLEVEL FROM ALL_INDEXES
WHERE TABLE_NAME=’EMPLOYEES’;
Technologia Flashback Technologia Flashback w bazie danych Oracle 11g jest jednym z ciekawszych rozwiązań, dość unikalnym
pośród baz relacyjnych dostępnych na rynku. Służy do “zaglądania w przeszłość” czyli odczytywania
danych z przeszłości, a więc nie tych aktualnych, które są w danej chwili zapisane w tabelach.
Dodatkowo, służy również do odtwarzania usuniętych tabel polecenie DROP z kosza (czyli tych
usuniętych poleceniem DROP ale bez słowa kluczowego PURGE). Flashback korzysta z przestrzeni tabel
UNDO w celu odczytania starych danych zmienionych przez transakcje.
Aby zacząć używać technologii Flashback należy sprawdzić i ewentualnie ustawić kilka parametrów
instancji bazy danych oraz przestrzeni tabel UNDO:
Parametry inicjalizacyjne instancji:
o UNDO_MANAGEMENT = AUTO
o UNDO_TABLESPACE=’UNDOTBS1’
o UNDO_RETENTION=900 – wartość wyrażona w sekundach
Parametr przestrzeni tabel UNDO: RETENTION = GUARANTEE
Parametry inicjalizacyjne instancji sprawdza się poleceniem:
SHOW PARAMETER UNDO_MANAGEMENT
SHOW PARAMETER UNDO_TABLESPACE
SHOW PARAMETER UNDO_RETENTION
Parametry inicjalizacyjne zmienia się poleceniem:
ALTER SYSTEM SET UNDO_RETENTION = 1000;
Parametr UNDO_RETENTION wyrażony jest w sekundach oznacza gwarantowany czas operacji flashback
czyli maksymalny czas do jakiego można cofnąć się w czasie.
Zarządzanie obiektami bazy danych Oracle 11g
Strona: 4 | Administracja bazą Oracle 11g | Studia Podyplomowe SGGW | Laboratorium nr 7 i 8
Dodatkowo, należy również sprawdzić czy przestrzeń tabel UNDOTBS1 rzeczywiście gwarantuje czas
podany w parametrze UNDO_RETENTION:
SELECT RETENTION FROM DBA_TABLESPACES WHERE TABLESPACE_NAME=’UNDOTBS1’
Jeśli wynik powyższego zapytania jest NOGUARANTEE to należy to zmienić poleceniem:
ALTER TABLESPACE UNDOTBS1 RETENTION GUARANTEE;
Odtwarzanie tabel z kosza po usunięciu Zanim spróbujemy odtwarzać usunięte tabele z kosza należy sprawdzić czy kosz jest w bazie włączony:
SHOW PARAMETER RECYCLEBIN
Jeśli jest ON to znaczy, że jest włączony. Jeśli nie, to trzeba go włączyć i zrestartować instancję:
ALTER SYSTEM SET RECYCLEBIN=ON SCOPE=SPFILE;
SHUTDOWN IMMEDIATE;
STARTUP;
Po usunięciu tabeli poleceniem DROP:
DROP TABLE EMPLOYEES;
Można ją przywrócić poleceniem:
FLASHBACK TABLE EMPLOYEES TO BEFORE DROP;
Można przejrzeć usunięte obiekty które są w koszu w perspektywie RECYCLEBIN:
SELECT OBJECT_NAME, ORIGINAL_NAME, OPERATION, DROPTIME
FROM RECYCLEBIN;
lub po prostu
SHOW RECYCLEBIN;
Zapytania o dane w przeszłości Aby dowiedzieć się jakie były dane w przeszłości używamy również polecenia SELECT tyle, że z klauzulą
“AS OF TIMESTAMP” lub “AS OF SCN”:
1. SELECT * FROM EMPLOYEES AS OF TIMESTAMP SYSDATE-1/1440 WHERE …;
2. SELECT * FROM EMPLOYEES AS OF SCN 23423423 WHERE …;
Pierwsze z powyższych zapytań wybiera z tabeli EMPLOYEES wiersze sprzed 1 minuty. SYSDATE -1
oznacza dzień wczorajszy, a SYSDATE – 1/1440 oznacza 1440 część dnia czyli dokładnie 1 minutę.
Zarządzanie obiektami bazy danych Oracle 11g
Strona: 5 | Administracja bazą Oracle 11g | Studia Podyplomowe SGGW | Laboratorium nr 7 i 8
Drugie zapytanie wybiera wiersze z konkretnego punktu w czasie określonego wartością SCN czyli
System Change Number. Każda zatwierdzona transakcja zwiększa SCN tak, żeby baza dokładnie
wiedziała kiedy i co działo się w transakcjach, a także czy pliki bazy są we właściwym stanie podczas
startu instancji. Aktualny SCN można wyciągnąć:
za pomocą funkcji PL/SQL - DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER
z kolumny CURRENT_SCN w perspektywie V$DATABASE
konwertując czas na SCN za pomocą funkcji TIMESTAMP_TO_SCN. Ta metoda zwraca tylko
przybliżoną wartość.
Oto przykłady:
SELECT DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER FROM DUAL
SELECT TIMESTAMP_TO_SCN(SYSDATE) FROM DUAL
SELECT CURRENT_SCN FROM V$DATABASE;
Zapytania typu flashback umożliwiają również wyświetlenie zmian w zakresie parametru SCN lub czasu
(TIMESTAMP) np:
SELECT VERSIONS_XID, SALARY FROM EMPLOYEES
VERSIONS BETWEEN TIMESTAMP <T1> AND <T2>
WHERE EMPLOYEE_ID = 200;
SELECT VERSIONS_XID, SALARY FROM EMPLOYEES
VERSIONS BETWEEN SCN <SCN1> AND <SCN2>
WHERE EMPLOYEE_ID = 200;
Zarządzanie obiektami bazy danych Oracle 11g
Strona: 6 | Administracja bazą Oracle 11g | Studia Podyplomowe SGGW | Laboratorium nr 7 i 8
Ćwiczenia
Ćwiczenie 1 – Indeksy 1. Stworzyć tabelę EMPLOYEES uruchamiając skrypy employees_ddl.sql
2. Sprawdzić jakie indeksy istnieją na tabeli HR.EMPLOYEES
3. Które indeksy są:
a. unikalne
b. typu B-TREE (NORMAL)
c. typu BITMAP
4. Założyć indeksy:
a. o nazwie EMP_SAL_IDX na kolumnie SALARY w tabeli EMPLOYEES
b. o nazwie EMP_NAME_IDX na dwóch kolumnach jednocześnie FIRST_NAME oraz
LAST_NAME
5. Uruchomić skrypt employees_dml.sql ,który załaduje dane do tabeli EMPLOYEES
6. Przeanalizować index EMP_SAL_IDX
a. z opcją COMPUTE STATISTICS
b. z opcją VALIDATE STRUCTURE
7. Przebudować index EMP_SAL_IDX i ponownie go przeanalizować. Czy jego rozmiar się zmniejszył
(czyli ilość bloków jaką zajmuje)?
Ćwiczenie 2 – Flashback 1. Sprawdzić czy kosz (RECYCLEBIN) jest włączony w bazie. Jeśli nie jest to go włączyć.
2. Usunąć tabelę EMPLOYEES.
3. Sprawdzić w koszu pod jaką nazwą dostępna jest usunięta tabela EMPLOYEES.
4. Wykonać zapytanie na obiekcie EMPLOYEES będącym w koszu. Czy da się odczytać wiersze?
5. Przywrócić tabelę EMPLOYEES z kosza. Czy się udało? Czy indeksy i więzy integralności też się
odtworzyły?
6. Sprawdzić aktualny SCN i TIMESTAMP
7. Dokonać aktualizacji wierszy i zatwierdzić transakcję
8. Wyświetlić wartości wierszy sprzed transakcji wykonanej w punkcie 7 technologią flashback.
9. Wyświetlić różne wersje zmodyfikowanych wierszy
10. Przywrócić stare wartości do tabeli sprzed aktualizacji w punkcie 7.
Zarządzanie obiektami bazy danych Oracle 11g
Strona: 7 | Administracja bazą Oracle 11g | Studia Podyplomowe SGGW | Laboratorium nr 7 i 8
Rozwiązania
Ćwiczenie 1 – Indeksy 1. Sprawdzić jakie indeksy istnieją na tabeli HR.EMPLOYEES
a. SELECT INDEX_NAME FROM USER_INDEXES WHERE TABLE_NAME =
'EMPLOYEES';
2. Które indeksy są:
a. unikalne
b. typu B-TREE (NORMAL)
c. typu BITMAP
d. SELECT INDEX_NAME, INDEX_TYPE, UNIQUENESS FROM USER_INDEXES
WHERE TABLE_NAME = 'EMPLOYEES'
3. Założyć indeksy:
a. o nazwie EMP_SAL_IDX na kolumnie SALARY w tabeli EMPLOYEES
i. CREATE INDEX EMP_SAL_IDX ON EMPLOYEES(SALARY); d
b. o nazwie EMP_NAME_IDX na dwóch kolumnach jednocześnie FIRST_NAME oraz
LAST_NAME
i. CREATE INDEX EMP_NAME_IDX ON EMPLOYEES (FIRST_NAME,
LAST_NAME);
4. Uruchomić skrypt employees.sql który załaduje dane do tabeli EMPLOYEES
a. @/mnt/employees.sql
5. Przeanalizować index EMP_SAL_IDX
a. z opcją COMPUTE STATISTICS
i. ANALYZE INDEX EMP_SAL_IDX COMPUTE STATISTICS;
ii. SELECT BLEVEL, LEAF_BLOCKS, DISTINCT_KEYS,
AVG_LEAF_BLOCKS_PER_KEY, AVG_DATA_BLOCKS_PER_KEY FROM
USER_INDEXES WHERE INDEX_NAME= 'EMP_SAL_IDX';
b. z opcją VALIDATE STRUCTURE
i. ANALYZE INDEX EMP_SAL_IDX VALIDATE STRUCTURE;
ii. SELECT HEIGHT, BLOCKS, USED_SPACE, DEL_LF_ROWS FROM
INDEX_STATS;
6. Przebudować index EMP_SAL_IDX i ponownie go przeanalizować. Czy jego rozmiar się zmniejszył
(czyli ilość bloków jaką zajmuje)?
a. ALTER INDEX EMP_SAL_IDX REBUILD;
b. ANALYZE INDEX EMP_SAL_IDX COMPUTE STATISTICS;
c. SELECT BLEVEL, LEAF_BLOCKS, DISTINCT_KEYS,
AVG_LEAF_BLOCKS_PER_KEY, AVG_DATA_BLOCKS_PER_KEY FROM
USER_INDEXES WHERE INDEX_NAME= 'EMP_SAL_IDX';
d. ANALYZE INDEX EMP_SAL_IDX VALIDATE STRUCTURE;
e. SELECT HEIGHT, BLOCKS, USED_SPACE, DEL_LF_ROWS FROM
INDEX_STATS;.
Zarządzanie obiektami bazy danych Oracle 11g
Strona: 8 | Administracja bazą Oracle 11g | Studia Podyplomowe SGGW | Laboratorium nr 7 i 8
Ćwiczenie 2 – Flashback 1. Sprawdzić czy kosz (RECYCLEBIN) jest włączony w bazie. Jeśli nie jest to go włączyć.
a. SHOW PARAMETER RECYCLEBIN
b. Jeśli wynik jest OFF to trzeba zmienić na ON
c. ALTER SYSTEM SET RECYCLEBIN = ON SCOPE=SPFILE;
2. Usunąć tabelę EMPLOYEES.
a. DROP TABLE EMPLOYEES;
3. Sprawdzić w koszu pod jaką nazwą dostępna jest usunięta tabela EMPLOYEES.
a. SHOW RECYCLEBIN
4. Wykonać zapytanie na obiekcie EMPLOYEES będącym w koszu. Czy da się odczytać wiersze?
a. SELECT * FROM “BIN$vydhwMSBPizgQKjAZTh/tA==$0”;
5. Przywrócić tabelę EMPLOYEES z kosza. Czy się udało? Czy indeksy i więzy integralności też się
odtworzyły?
a. FLASHBACK TABLE EMPLOYEES TO BEFORE DROP;
b. SELECT INDEX_NAME FROM USER_INDEXES WHERE TABLE_NAME =
'EMPLOYEES';
c. SELECT CONSTRAINT_NAME FROM USER_CONSTRAINTS WHERE
TABLE_NAME= 'EMPLOYEES'
d. Indeksy i więzy integralności są przywracane, ale z nazwami które miały w koszu.
6. Sprawdzić aktualny SCN i TIMESTAMP
A. CONN / AS SYSDBA
B. SELECT DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER FROM DUAL;
c. SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') FROM DUAL;
7. Dokonać aktualizacji wierszy i zatwierdzić transakcję
a. UPDATE EMPLOYEES SET SALARY = SALARY +1000 WHERE
EMPLOYEE_ID=1000;
8. Wyświetlić wartości wierszy sprzed transakcji wykonanej w punkcie 7 technologią flashback.
a. SELECT * FROM EMPLOYEES AS OF SCN 4124141 WHERE EMPLOYEE_ID
= 1000;
9. Wyświetlić różne wersje zmodyfikowanych wierszy
A. SELECT VERSIONS_XID, SALARY FROM EMPLOYEES VERSIONS BETWEEN
TIMESTAMP <T1> AND <T2> WHERE EMPLOYEE_ID = 1000;
10. Przywrócić stare wartości do tabeli sprzed aktualizacji w punkcie 7.
a. UPDATE EMPLOYEES SET SALARY = (SELECT SALARY FROM EMPLOYEES
AS OF SCN 4124141 WHERE EMPLOYEE_ID=1000) WHERE
EMPLOYEE_ID=1000;
b. COMMIT;
Comment [m1]: Nazwa pod jaką odnajdujemy usuniętą tabelę będzie inna w każdej instancji bazy
Comment [m2]: SCN należy pobrać z punktu 6 b
Comment [m3]: Pod <T1> i <T2>