W poprzednim artykule dowiedzieliśmy się o tabeli partycjonowanej Oracle. Kontynuując tę serię, przedstawię tutaj indeks partycji Oracle
Oto kilka faktów dotyczących zrozumienia indeksów partycjonowanych
Lokalne indeksy partycji
- Indeks lokalny w tabeli partycjonowanej jest tworzony, gdy indeks jest podzielony na partycje w dokładnie taki sam sposób, jak bazowa tabela partycjonowana. Oznacza to, że indeks lokalny dziedziczy metodę partycjonowania tabeli. Jest to znane jako ekwiwalentne partycjonowanie.
- W przypadku indeksów lokalnych klucze indeksu w indeksie będą odnosić się tylko do wierszy przechowywanych w pojedynczej partycji tabeli bazowej. Indeks lokalny jest tworzony przez określenie atrybutu LOCAL i może być utworzony jako UNIQUE lub NON-UNIQUE.
- Tabela i indeks lokalny są albo podzielone na partycje w dokładnie ten sam sposób, albo mają ten sam klucz partycji, ponieważ indeksy lokalne są obsługiwane automatycznie, co może zapewnić wyższą dostępność.
- Ponieważ baza danych Oracle zapewnia, że partycje indeksu są synchronizowane z odpowiadającymi im partycjami tabeli, wynika z tego, że baza danych automatycznie utrzymuje partycję indeksu za każdym razem, gdy na bazowych tabelach jest wykonywana jakakolwiek operacja konserwacji
- na przykład, gdy partycje są dodawane, usuwane lub łączone.
- Indeks lokalny jest poprzedzony, jeśli klucz partycji tabeli i klucz indeksu są takie same; w przeciwnym razie jest to lokalny indeks bez prefiksu
SQL> CREATE TABLE EXP_PART (id number, item_id number, name varchar2(20)) PARTITION BY RANGE (id, item_id) (partition EXP_PART_1 values less than (10, 100), partition EXP_PART_2 values less than (20, 200), partition EXP_PART_3 values less than (30, 300), partition EXP_PART_4 values less than (40, 400)); Table created. SQL> CREATE INDEX test_idx ON EXP_PART(id, item_id) LOCAL (partition test_idx_1, partition test_idx_2, partition test_idx_3, partition test_idx_4); Index created. SQL> SELECT index_name, partition_name, status FROM user_ind_partitions where index_name='TEST_IDX' ORDER BY index_name, partition_name; INDEX_NAME PARTITION_NAME STATUS --------- ----------- ------ TEST_IDX IX_TEST_IDX_1 USABLE TEST_IDX IX_TEST_IDX_2 USABLE TEST_IDX IX_TEST_IDX_3 USABLE TEST_IDX IX_TEST_IDX_4 USABLE
Globalne partycjonowane indeksy
- Globalny indeks partycjonowany to indeks partycjonowanej lub niepartycjonowanej tabeli, która jest podzielona na partycje niezależnie, tj. przy użyciu innego klucza partycjonowania niż tabela. Globalne indeksy partycjonowane mogą być partycjonowane w zakresie lub hash.Globalne indeksy partycjonowane są trudniejsze w utrzymaniu niż indeksy lokalne. Oferują jednak bardziej wydajną metodę dostępu do każdego indywidualnego rekordu.
- Podczas interakcji tabeli lub indeksu podczas konserwacji partycji, wszystkie partycje w indeksie globalnym zostaną naruszone.
- Gdy na podstawowej partycji tabeli są wykonywane operacje konserwacji SPLIT, MOVE, DROP lub TRUNCATE, zarówno globalne indeksy, jak i globalne indeksy partycjonowane będą oznaczone jako bezużyteczne. Wynika z tego, że niezależność partycji nie jest możliwa dla indeksów globalnych.
- W zależności od typu operacji wykonywanej na partycji tabeli, wpłynie to na indeksy w tabeli. Podczas zmiany partycji tabeli można określić klauzulę UPDATE INDEXES. Powoduje to automatyczne utrzymanie dotkniętych globalnymi indeksami i partycjami.
- Zaletą korzystania z tej opcji jest to, że indeks pozostanie online i będzie dostępny przez całą operację i nie będzie trzeba go odbudowywać po zakończeniu operacji.
SQL> CREATE TABLE EXP_PART (id number, item_id number, name varchar2(20)) PARTITION BY RANGE (id, item_id) (partition EXP_PART_1 values less than (10, 100), partition EXP_PART_2 values less than (20, 200), partition EXP_PART_3 values less than (30, 300), partition EXP_PART_4 values less than (40, 400)); Table created. SQL> CREATE UNIQUE INDEX EXP_PART_IDX ON EXP_PART(id, item_id) GLOBAL PARTITION BY RANGE (id, item_id) (partition EXP_PART_IDX_1 values less than (20, 200), partition EXP_PART_IDX_2 values less than (maxvalue, maxvalue)); Index created. SQL> SELECT index_name, partition_name, status FROM user_ind_partitions where index_name='EXP_PART_IDX' ORDER BY index_name, partition_name; INDEX_NAME PARTITION_NAME STATUS EXP_PART_IDX EXP_PART_IDX_1 USABLE EXP_PART_IDX EXP_PART_IDX_2 USABLE
Globalne indeksy bez partycji
- Globalne indeksy niepartycjonowane oferują ten sam wydajny dostęp do każdego pojedynczego rekordu w dowolnej partycji i zachowują się jak indeks niepartycjonowany. Ponieważ struktura indeksu nie jest podzielona na partycje, indeks jest dostępny dla wszystkich partycji.
- Scenariusz, w którym ten typ indeksu byłby przydatny, dotyczy zapytania, które nie zawiera klucza partycji tabeli jako filtru, ale nadal chcesz, aby optymalizator Oracle używał indeksu
Najczęściej zadawane pytania
Co to jest indeks z prefiksem i bez prefiksu?Indeks jest nazywany z prefiksem, jeśli wiodące kolumny w definicji indeksu są kolumnami klucza partycji, w przeciwnym razie jest nazywany bez prefiksu.
Czy możemy podzielić indeks globalny na podpartycje?Nie, nie można podzielić indeksu globalnego na podpartycje, ale można go podzielić. Jedynym sposobem, aby uzyskać podpartycjonowanie indeksu, jest posiadanie tabeli podzielonej na podpartycjonowanie z lokalnym indeksem
Jak sprawdzić, czy indeks jest globalny czy lokalnyWysyłając zapytanie do kolumny LOCALITY w DBA_PART_INDEXES.
Też czyta
- Samouczki administracji bazy danych Oracle
- https://docs.oracle.com/en/database/oracle/oracle-database/18/vldbg/index-partitioning.html#GUID-569F94D0-E6E5-45BB-9626-5506DE18FF00
- zmień format daty w Oracle