Indeksy częściowe w Oracle Database 12c

Oracle Database 12c oferuje ciekawe rozwiązanie, pozwalające zredukować rozmiar indeksu tworzonego na tabeli partycjonowanej, w której wiele partycji ma charakter archiwalny (bardzo rzadko podlega zapytaniom). Indeks częściowy – bo o nim mowa – może obejmować swoim zasięgiem wybrane partycje tabeli, podczas gdy rekordy w pozostałych partycjach tabeli pozostają bez indeksu. Gdy realizowane jest zapytanie do tak indeksowanej tabeli, optymalizator zapytań skorzysta z indeksu w przypadku partycji uwzględnionych w indeksie, oraz z pełnego odczytu partycji w pozostałych przypadkach.
Aby utworzyć indeks częściowy należy najpierw na poziomie tabeli wskazać, które jej partycje powinny być uwzględniane w indeksie, a które nie (klauzula „indexing”):

create table faktury (nr varchar2(20), kwota number(8,2), data date)
partition by range (data)
(partition p1 values less than (to_date('01-01-2014','DD-MM-YYYY')) indexing off,
partition p2 values less than (to_date('01-01-2015','DD-MM-YYYY')) indexing off,
partition p3 values less than (to_date('01-01-2016','DD-MM-YYYY')) indexing on);

a następnie utworzyć indeks z klauzulą „indexing partial”:

create index i1 on faktury(nr) indexing partial;

A oto przykład planu wykonania zapytania do tabeli posiadającej indeks częściowy.

select * from faktury where nr='12345'

------------------------------------------------------------------------------
| Id | Operation                                  | Name   |Rows|Pstart|Pstop|
------------------------------------------------------------------------------
| 0  | SELECT STATEMENT                           |        | 114|      |     |
| 1  | VIEW                                       | VW_TE_2|    |      |     |
| 2  | UNION-ALL                                  |        |    |      |     |
|* 3 | TABLE ACCESS BY GLOBAL INDEX ROWID BATCHED | FAKTURY| 76 |    3 |   3 |
|* 4 | INDEX RANGE SCAN                           | I1     | 114|      |     |
| 5  | PARTITION RANGE ITERATOR                   |        | 75 |    1 |   2 |
|* 6 | TABLE ACCESS FULL                          | FAKTURY| 75 |    1 |   2 |
------------------------------------------------------------------------------

Zapytanie zostało podzielone na dwie części. Przeszukanie partycji nr 3 odbyło się z użyciem indeksu. Partycje nr 1 i nr 2 zostały poddane pełnemu odczytowi.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *