Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Índice de partição Oracle


No artigo anterior, aprendemos sobre a tabela particionada do Oracle. Na continuação dessa série, apresentarei aqui o índice de partição Oracle

Aqui estão alguns dos fatos sobre Noções básicas sobre índices particionados

Índices de partição locais

  • Um índice local em uma tabela particionada é criado onde o índice é particionado exatamente da mesma maneira que a tabela particionada subjacente. Ou seja, o índice local herda o método de particionamento da tabela. Isso é conhecido como equi-particionamento.
  • Para índices locais, as chaves de índice dentro do índice farão referência apenas às linhas armazenadas na partição de tabela subjacente única. Um índice local é criado especificando o atributo LOCAL e pode ser criado como UNIQUE ou NON-UNIQUE.
  • A tabela e o índice local são particionados exatamente da mesma maneira ou têm a mesma chave de partição porque os índices locais são mantidos automaticamente, podendo oferecer maior disponibilidade.
  • Como o banco de dados Oracle garante que as partições de índice sejam sincronizadas com suas partições de tabela correspondentes, o banco de dados mantém automaticamente a partição de índice sempre que qualquer operação de manutenção é executada nas tabelas subjacentes
  • por exemplo, quando partições são adicionadas, eliminadas ou mescladas.
  • Um índice local é prefixado se a chave de partição da tabela e a chave de índice forem as mesmas; caso contrário, é um índice local não prefixado
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

Índices particionados globais

  • Um índice particionado global é um índice em uma tabela particionada ou não particionada que é particionada independentemente, ou seja, usando uma chave de particionamento diferente da tabela. Índices particionados globalmente podem ser particionados por intervalo ou hash. Os índices particionados globais são mais difíceis de manter do que os índices locais. No entanto, eles oferecem um método de acesso mais eficiente a qualquer registro individual.
  • Durante a interação de tabela ou índice durante a manutenção da partição, todas as partições em um índice global serão afetadas.
  • Quando a partição de tabela subjacente tiver quaisquer operações de manutenção SPLIT, MOVE, DROP ou TRUNCATE executadas nela, tanto os índices globais quanto os índices particionados globais serão marcados como inutilizáveis. Portanto, a independência de partição não é possível para índices globais.
  • Dependendo do tipo de operação realizada em uma partição de tabela, os índices da tabela serão afetados. Ao alterar uma partição de tabela, a cláusula UPDATE INDEXES pode ser especificada. Isso mantém automaticamente os índices e partições globais afetados.
  • As vantagens de usar essa opção são que o índice permanecerá online e disponível durante toda a operação e não precisará ser reconstruído após a conclusão da operação.
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

Índices globais não particionados

  • Os índices globais não particionados oferecem o mesmo acesso eficiente a qualquer registro individual em qualquer partição e se comportam exatamente como um índice não particionado. Como a estrutura de índice não é particionada, o índice está disponível para todas as partições.
  • Um cenário em que esse tipo de índice seria útil é com uma consulta que não inclui a chave de partição da tabela como filtro, mas você ainda deseja que o otimizador oracle use um índice

Perguntas frequentes

Qual ​​é o índice prefixado e não prefixado?
O índice é chamado de prefixado se a(s) coluna(s) inicial(is) na definição do índice for(em) a(s) coluna(s) da chave de partição, caso contrário, é chamado de não prefixado.
Podemos dividir o índice global?
Não, você não pode particionar o índice global, mas pode particioná-lo. A única maneira de acabar com a subpartição de índice é ter uma tabela sub-particionada com índice local
Como descobrir se um índice é global ou local
Ao consultar a coluna, LOCALITY, em DBA_PART_INDEXES.

Também lê
  • Tutoriais de administração de banco de dados Oracle
  • https://docs.oracle.com/en/database/oracle/oracle-database/18/vldbg/index-partitioning.html#GUID-569F94D0-E6E5-45BB-9626-5506DE18FF00
  • alterar formato de data no oracle