Perigos e Armadilhas do Particionamento - Etapa 2 – Parte 01

Neste artigo conheceremos perigos e armadilhas do particionamento.

Perigos e Armadilhas do Particionamento - Etapa 2 – Parte 01

por Arup Nanda 

Chaves de Partição Multi-colunadas (Multi-Column Partition Keys)

A maioria dos documentos, artigos, livros e outras publicações, falam sobre o uso de uma única coluna para chave de particionamento, mas que tal usar duas ou mais colunas? Definitivamente é possível, mas em tal caso, como deveríamos proceder?
 

Muitas pessoas têm a impressão de que especificando mais de uma coluna como chave de particionamento cria-se uma tabela particionada multidimensional. Por exemplo, se você tem uma tabela chamada "faixa de empregado" particionada em (DEPTNO, ZIPCODE), isso significa que são avaliados os valores de ambas as colunas quando se está decidindo sobre a colocação da linha em uma partição? 
Infelizmente, a resposta é não. 
 

A segunda coluna na chave de particionamento só é usada em alguns casos especiais. Ambos os valores não precisam ser satisfeitos para uma linha  ir para uma partição específica. A primeira coluna é avaliada antes; se satisfizer a condição, então a segunda coluna não é avaliada. Porém, se o primeiro valor da coluna não for totalmente satisfatório, a próxima coluna é considerada. 

Isto será mais bem entendido talvez utilizando-se um exemplo. Considere o seguinte:

create table ptab1

col1 number(10),
  col2 number(10),
col3 varchar2(20)
)
partition by range (col1, col2)
(
partition p1 values less than (101, 101),
partition p2 values less than (201, 201)
)

 

 

É uma percepção popular que quando uma linha é inserida, se ambos os valores de col1 e col2 são menores que 101, então vão para a partição P1; se os valores são menores que 201, porém maiores ou igual a 101, vão para a partição P2; caso contrário, vão para a partição PM. Em nosso exemplo, vejamos para qual partição serão direcionados. Aqui estão todas as linhas da tabela: 

select * from ptab1;
    COL1      COL2COL3
--------- ---------- ------
    100100        rec1
    102102        rec2
    100102    rec3
    102100    rec4
    101100    rec5
    101101        rec6
    101102        rec7
    201100    rec8
    201101    rec9
    201102     rec10

Em quais partições os registros serão inseridos? Confiramos o primeiro: 

select * from ptab1 partition (p1);
   COL1    COL2     COL3
---------- ---------- ------
   100   100   rec1
   100102        rec3
   101100        rec5


O registro REC1 está na partição P1, como esperado. Mas REC3 deveria estar na partição P1? O valor da coluna COL1, que é 100, é menor que 101 e então satisfaz a condição. Porém COL2 tem 102, e é maior que 101, o valor de limite de COL2. Como é que COL2 foi para a partição P1? A razão é bastante simples: P1 é a primeira partição, o valor é avaliado pela primeira coluna (COL1) e satisfaz, assim o valor da coluna COL2 não é nem mesmo avaliado. O registro vai para P1, embora o critério de COL2 não seja satisfeito. 

Assim, se a segunda coluna, COL2, não é nem mesmo considerado em alguns casos, onde entraria em jogo e por que seria definido assim? Considere o registro REC5 no qual o valor de COL1 é 101, para a chave de particionamento é um valor incerto daquela coluna. Mas neste caso, é considerada a segunda coluna. Neste caso, o valor de COL2 é 100, menor que o valor de limite de COL2 na chave de particionamento (101); então, entra na partição P1. Veja os registros na partição P2. 

select * from ptab1 partition (p2);


  COL1         COL2      COL3
---------- ---------- -----
   102102 rec2
   102100 rec4
   101101 rec6
   101102 rec7
   201100 rec8
   201101 rec9
   201102 rec10

Os registros REC2, REC4, e REC7 satisfazem as colunas e são, como esperado, inseridos na partição P2. Porém, para REC6, o valor de COL1 é 101, que é o valor limite para a primeira coluna da chave de particionamento. Assim, REC6 cai na consideração especial para chaves de particionamento multi-colunados. Porque o valor 101 de COL2 é maior que o valor limite da coluna COL2 da partição P1 (101), as linhas foram para a partição P2. 

Pela mesma lógica, para os registros REC8, REC9 e REC10, o valor de COL1 é 201 exatamente no limite para o valor daquela coluna na chave de particionamento. Porém, o valor de COL2 é menor que 201 e o valor limite daquela coluna em P2. Então, as linhas foram para a partição P2. 

O que acontece quando você insere uma linha com COL1 = 201 e COL2 = 201? 

Esta linha entrará na partição PM, desde que ambas as colunas não podem estar fora dos limites. Esquematicamente, a decisão para inserir em uma partição pode ser explicada pela figura abaixo.

 

 

  

Então o que acontece no caso da lista de particionamento no Oracle 9i, onde não há nenhum conceito de uma faixa e, portanto, não há nenhum valor de limite? Felizmente, a lista de particionamento não permite colunas múltiplas, assim esta situação não surge.

Aparentemente, considerando a confusão potencial sobre a colocação de linhas em partições, não vale a pena o uso de chaves de particionamento multi-colunadas. Porém, em alguns casos especiais, pode ser muito útil. Por exemplo, considere uma tabela chamada SALES com colunas SALES_YEAR, SALES_MONTH e SALES_DAY, em vez de uma única coluna chamada SALES_DATE. Isto é útil em alguma implementação de projeto de datawarehouse para habilitar dimensões e hierarquias. Em tal caso, você poderia usar uma chave de particionamento em todas as três colunas para efetivamente projetar as partições. 

Armadilha potencial: Tenha cuidado quando for definir colunas múltiplas como chave de particionamento. Se tiver que faze-lo, use casos de teste precisamente em torno dos valores limite. 

 

Artigos relacionados