Partial Indexes for Partitioned Tables in Oracle Database

Configurare noua (How To)

Situatie

Table: INDEXING [ON | OFF] Clause

Decizia despre ce partiții sunt indexate se ia folosind INDEXING [ON | OFF] asociată fiecărei partiții, implicit fiind INDEXING ON. Creăm un tabel partiționat cu trei partiții. Primele două partiții au indexarea activată. Una implicit și alta în mod explicit. A treia partiție are indexarea dezactivată.

— Creați și completați tabelul partiționat.

drop table t1 purge;

create table t1 (
id number,
description varchar2(50),
created_date date
)
partition by range (created_date) (
partition part_2021 values less than (date ‘2021-01-01’),
partition part_2022 values less than (date ‘2022-01-01’) indexing on,
partition part_2023 values less than (date ‘2023-01-01’) indexing off
);

insert into t1 values (1, ‘t1 one’, date ‘2021-07-01’);
insert into t1 values (2, ‘t1 two’, date ‘2023-07-01’);
insert into t1 values (3, ‘t1 three’, date ‘2023-01-01’);
commit;

Coloana INDEXING a viewului USER_TAB_PARTITIONS ne arată starea de indexare a fiecărei partiții. Doar partiția 2023 are INDEXING dezactivat.

column table_name format a20
column partition_name format a20

select table_name,
partition_name,
indexing
from user_tab_partitions
where table_name = ‘T1’
order by 1,2;

TABLE_NAME PARTITION_NAME INDE
——————– ——————– —-
T1 PART_2021 ON
T1 PART_2022 ON
T1 PART_2023 OFF

SQL>

Schimbăm clauza de indexare pentru o partiție folosind comanda ALTER TABLE … MODIFY PARTITION. Dezactivăm indexarea pentru partițiile 2021 și 2022 și activăm indexarea pentru partiția 2023.

alter table t1 modify partition part_2021 indexing off;
alter table t1 modify partition part_2022 indexing off;
alter table t1 modify partition part_2023 indexing on;

Putem vedea modificările reflectate în rezultatul din vizualizarea USER_TAB_PARTITIONS. Indexarea este dezactivată pentru partițiile 2021 și 2022. Indexarea este activată pentru partiția 2023.

select table_name,
partition_name,
indexing
from user_tab_partitions
where table_name = ‘T1’
order by 1,2;

TABLE_NAME PARTITION_NAME INDE
——————– ——————– —-
T1 PART_2021 OFF
T1 PART_2022 OFF
T1 PART_2023 ON

SQL>

Index: INDEXING [FULL | PARTIAL] Clause

Chiar și cu setările de indexare a partiției activate, în mod implicit, indecșii sunt creați ca INDEXING FULL, deci setarea partiției este ignorată.

Creăm un index local pe coloana CREATED_DATE. Dacă nu specificăm clauza INDEXING în timpul creării indexului, acțiunea implicită este INDEXING FULL.

drop index t1_local_partial_idx;

— create index t1_local_partial_idx on t1(created_date) local indexing full;
create index t1_local_partial_idx on t1(created_date) local;

Verificând coloana STATUS a viewului USER_IND_PARTITIONS, vedem că toate partițiile indexului sunt utilizabile. În mod implicit, crearea indexului ignoră setarea INDEXARE a partițiilor de tabel.

column index_name format a25

select index_name,
partition_name,
status
from user_ind_partitions
where index_name = ‘T1_LOCAL_PARTIAL_IDX’
order by 1,2;

INDEX_NAME PARTITION_NAME STATUS
————————- ——————– ——–
T1_LOCAL_PARTIAL_IDX PART_2021 USABLE
T1_LOCAL_PARTIAL_IDX PART_2022 USABLE
T1_LOCAL_PARTIAL_IDX PART_2023 USABLE

SQL>

Verificând coloana INDEXING a vizualizării USER_INDEXES, vedem că indexul este marcat ca indexare COMPLET.

column indexing format a8

select index_name,
indexing
from user_indexes
where index_name = ‘T1_LOCAL_PARTIAL_IDX’
order by 1;

INDEX_NAME INDEXING
————————- ——–
T1_LOCAL_PARTIAL_IDX FULL

SQL>

Stergem indexul și îl creăm din nou, de data aceasta folosind clauza INDEXING PARTIAL.

drop index t1_local_partial_idx;
create index t1_local_partial_idx on t1(created_date) local indexing partial;

Acum vedem că partițiile de tabel marcate ca INDEXING OFF nu sunt indexate și au partiții de index marcate ca inutilizabile. Partiția de tabel din 2023 a fost marcată ca INDEXING ON, deci este indexată și vedem o partiție de index utilizabilă.

select index_name,
partition_name,
status
from user_ind_partitions
where index_name = ‘T1_LOCAL_PARTIAL_IDX’
order by 1,2;

INDEX_NAME PARTITION_NAME STATUS
————————- ——————– ——–
T1_LOCAL_PARTIAL_IDX PART_2021 UNUSABLE
T1_LOCAL_PARTIAL_IDX PART_2022 UNUSABLE
T1_LOCAL_PARTIAL_IDX PART_2023 USABLE

SQL>

Verificând coloana INDEXING a vizualizării USER_INDEXES, vedem că indexul este marcat ca indexare PARTIAL.

column indexing format a8

select index_name,
indexing
from user_indexes
where index_name = ‘T1_LOCAL_PARTIAL_IDX’
order by 1;

INDEX_NAME INDEXING
————————- ——–
T1_LOCAL_PARTIAL_IDX PARTIAL

SQL>

Indecșii globali pot fi creați și ca indecși parțiali, doar cu partițiile marcate incluse în index.
Creăm un index global parțial. Observați utilizarea clauzei de indexare “partial”. Indexul rezultat este marcat ca INDEXING PARTIAL.

create index t1_global_partial_idx on t1(description) global indexing partial;

— Verificati statusul indexului

select index_name,
indexing
from user_indexes
where index_name like ‘T1%’
order by 1;

INDEX_NAME INDEXING
————————- ——–
T1_GLOBAL_PARTIAL_IDX PARTIAL
T1_LOCAL_PARTIAL_IDX PARTIAL

SQL>

Solutie

Tip solutie

Permanent

Voteaza

(12 din 32 persoane apreciaza acest articol)

Despre Autor

Leave A Comment?