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

Tabela particionada do Oracle

O que é Tabela Particionada Oracle?


O particionamento divide uma tabela, índice ou tabela organizada por índice em componentes menores. Cada componente é chamado de partição (ou subpartição para objetos particionados compostos). Cada partição tem um nome exclusivo e, opcionalmente, pode ter características de armazenamento individuais:os exemplos incluem compactação ou armazenamento em diferentes espaços de tabela. Uma estratégia de particionamento bem projetada pode melhorar o acesso e as atualizações de consultas limitando a operação a um único ou subconjunto de partições.

Particionamento para desempenho – Remoção de partições


O recurso Oracle Partitioned table permite que o otimizador de consulta ignore partições que não são exigidas por uma instrução SQL específica. Dependendo da instrução SQL, o otimizador pode identificar partições e subpartições que precisam ser acessadas, bem como aquelas que não precisam. Isso pode resultar em melhorias substanciais no desempenho da consulta, porque o otimizador se concentra em um subconjunto específico de dados que pode ser refinado ainda mais se existirem predicados adicionais.

O otimizador faz isso usando as informações de partição armazenadas no dicionário de dados para identificar o conteúdo de uma partição sem consultar os dados que ela contém. O particionamento é uma camada extra do dicionário de dados entre tabelas/índices e tablespaces

Limitação de Tabela Particionada


No Oracle Database 11g, uma tabela pode ter no máximo 1048575 (1024K – 1) partições. Com a única exceção de tabelas contendo colunas de tipos de dados LONG ou LONG RAW, todas as tabelas podem ser particionadas (incluindo colunas do tipo CLOB ou BLOB).

Tipo de partições de tabela


O particionamento está disponível no banco de dados Oracle a partir da versão 8.0 e o Oracle está continuamente adicionando mais e mais recursos a cada lançamento. A tabela a seguir mostra um resumo das principais alterações

A principal estratégia de partição fornecida pela Oracle são
(1)Range
(2)List
(3) Hash
(4)Composite

Como criar a tabela de partição


Dependendo dos tipos de partição, aqui está a maneira de criar a tabela de partição

Particionamento de intervalo


Oracle Particione os dados com base em intervalos consecutivos de valores da chave de partição.
O ponto final de cada partição é especificado usando a seguinte sintaxe:
VALUES LESS THAN (value-list)

Exemplo
CREATE TABLE EXP_RANGE
 (ID NUMBER(15) NOT NULL,
 CODE_ID NUMBER(15) NOT NULL,
 PERIOD_NAME VARCHAR2(15) NOT NULL,
 ACTUAL_FLAG VARCHAR2(1) NOT NULL,
 VERSION_ID NUMBER(15),
 LAST_UPDATE_DATE DATE NOT NULL,
 . . . . . .
 )
 PARTITION BY RANGE (PERIOD_NAME)
 (
 PARTITION PR1 VALUES LESS THAN ('JAN-2019'),
 PARTITION PR2 VALUES LESS THAN ('FEB-2019')
 . . .
 . . .
 );

Particionamento de intervalo é útil para particionar dados históricos e de transação, pois os limites da partição de intervalo definem a ordem de partição em tabelas e índices

Lista de particionamento


Nesse método, o Oracle mapeia linhas específicas para partições, com base em uma lista estática de valores literais. A chave de partição para particionamento de lista só pode ser baseada em uma única coluna.
CREATE TABLE EXP_LIST
 (ID NUMBER NOT NULL,
 ORG_ID NUMBER,
 OPEN_FLAG VARCHAR2(4) NOT NULL,
 . . . . . .
 ) PARTITION BY LIST (open_flag)
 (
 PARTITION PR1 VALUES ('YES'),
 PARTITION PR2 VALUES ('NO')
 );

Particionamento de hash


Neste oráculo utilizou-se o algoritmo de hashing para decidir o posicionamento físico dos dados. O particionamento de hash distribuirá os dados uniformemente em um número fixo de partições.
CREATE TABLE EXP_HASH
 (ID NUMBER NOT NULL,
 ORG_ID NUMBER,
 ORDERED_ITEM VARCHAR2(2000),
 OPEN_FLAG VARCHAR2(1) NOT NULL,
 . . . . . .
 )
 PARTITION BY HASH (ID)
 PARTITIONS 10
 . . .
 . . .;
 );

Particionamento composto


Neste oráculo usado a combinação de particionamento de intervalo, lista e hash. Os métodos de particionamento compostos são range-hash ou range-list.
CREATE TABLE sales_details
   ( prod_id       NUMBER(6)
   , cust_id       NUMBER
   , time_id       DATE
   , channel_id    VARCHAR2(1)
   , promo_id      NUMBER(6)
   , quantity_sold NUMBER(3)
   , amount_sold   NUMBER(10,2)
   )
  PARTITION BY RANGE (time_id) SUBPARTITION BY HASH (cust_id)
   SUBPARTITIONS 8 STORE IN (ts1, ts2, ts3, ts4)
  ( PARTITION sales_q1_2019 VALUES LESS THAN (TO_DATE('01-APR-2019','dd-MON-yyyy'))
  , PARTITION sales_q2_2019 VALUES LESS THAN (TO_DATE('01-JUL-2019','dd-MON-yyyy'))
  , PARTITION sales_q3_2019 VALUES LESS THAN (TO_DATE('01-OCT-2019','dd-MON-yyyy'))
  , PARTITION sales_q4_2019 VALUES LESS THAN (TO_DATE('01-JAN-2019','dd-MON-yyyy'))
  );

Como mover o objeto existente para o objeto Particionado


Há muitas maneiras de conseguir essa façanha. Estou explicando aqui o método simplista
1.Crie uma tabela particionada vazia usando a cláusula partitioned e com a opção paralela. O nome da tabela deve ter um nome diferente da tabela não particionada.
2. Preencha os dados para a partição necessária da tabela não particionada.
3. Considere usar a dica do oráculo APPEND com uma instrução INSERT como uma alteração de código fácil que oferece bom desempenho. Se o registro estiver ativado e os índices estiverem presentes, a dica INSERT /*+ APPEND */ pode não ser eficaz.>4.Renomeie a tabela particionada para igual à tabela original ou altere o sinônimo.
5. Crie índices de tabela para a tabela particionada

Também lê
Oracle Partition Index
Oracle Parallel Query
https://docs.oracle.com/cd/B28359_01/server.111/b32024/partition.htm