Tworzenie indeksu częściowego bazie danych PostgreSQL (index partitioning)

Obiektowo-relacyjna baza danych PostgreSQL umożliwa tworzenie indeksów częściowy (ang. index partitioning). Czyli takich dla których wartość indeksowana jest dodawana do indeksu dopiero po spełnieniu określonych warunków.

Przykładowo mają tabelę klientów (customer), która zawiera kolumnę typu boolean o nazwie deleted oznaczającą wartościami true wiesze usunięte oraz kolumnę typu znakowego o nazwie surname i chciali byśmy indeksować tylko nazwy klientów nie skasowanych (np. ze względów wydajnościowych) to możemy założyć na kolumę nazwiska (surname) indeks częściowy.

CREATE INDEX customer_I customer (surname) WHERE deleted = false;

 

surname deleted  
kowalski true nazwisko nie zostanie zaindeksowane
kowalski false nazwisko zostanie zaindeksowane
kowalski true nazwisko nie zostanie zaindeksowane

 

Bardziej ciekawym i praktycznym zarazem przykładem jest tworzenie indeksów częściowych dla wartości unikatowych. Załóżmy, że mamy tabelę z danymi adresowymi, która przechowuje aktualne oraz archiwalne adresy klienta i chcemy mieć pewność, że klient będzie miał zawsze nie więcej niż jeden aktualny adres, ale nie chcemy w tym celu robić wyzwalaczy. Wykorzystując własność indeksów unikatowych, które dopuszczają tylko jednokrotne wystąpienie wartości w indeksie zakładamy indeks na kolumnę z identyfikatorem klienta oraz kolumną oznaczającą aktualny adres.

CREATE UNIQUE INDEX customer_address_U ON customer_address (customer_id, is_actual) WHERE is_actual = true;

 

customer_id is_actual street  
1 false kochanowskiego można wstawić wiersz do tabeli
1 true miodowa można wstawić wiersz do tabeli
1 true polna nie można wstawić wiersza do tabeli ponieważ już ten klient ma adres oznaczony jako aktualny
2 true polna można wstawić wiersz do tabeli ponieważ jest dodawany dla innego klienta
2 false miodowa można wstawić wiersz do tabeli