O particionamento por lista puro apresenta limitações em dois cenários: quando o conjunto de valores da chave de particionamento é aberto ou desconhecido no momento da criação da tabela e quando uma distribuição de cauda longa torna impraticável atribuir uma partição exclusiva a cada chave de baixo volume. O particionamento LIST DEFAULT HASH resolve ambos os problemas ao combinar partições de lista dedicadas para chaves de alto volume com subpartições hash que absorvem automaticamente os demais dados.
Casos de uso
Use o particionamento LIST DEFAULT HASH quando uma das condições a seguir se aplicar:
Valores da chave de particionamento não totalmente enumeráveis — os valores possíveis são abertos ou desconhecidos durante a criação da tabela.
Distribuição de chaves em cauda longa — poucas chaves de alto volume concentram a maior parte dos dados, enquanto muitas chaves de baixo volume dividem o restante. Um indicador comum é o padrão 80/20: 20% dos valores da chave de particionamento armazenam 80% dos dados; os 80% restantes dos valores armazenam os 20% finais.
Em ambas as situações, forçar cada chave de baixo volume a entrar em uma partição de lista nomeada desperdiça partições e aumenta a sobrecarga de manutenção. O particionamento LIST DEFAULT HASH permite atribuir partições de lista dedicadas às chaves de alto volume e direcionar todo o restante para um conjunto de subpartições hash, distribuindo a carga uniformemente.
Exemplo multilocatário
Um sistema de pedidos multilocatário no qual algumas contas-chave geram a maior parte dos dados é um caso típico de aplicação. A tabela a seguir mostra uma distribuição representativa:
|
Locatário |
Volume de dados |
Partição |
|
Conta-chave 1 |
30 milhões de linhas |
p1 |
|
Conta-chave 2 |
26 milhões de linhas |
p2 |
|
Conta-chave 3 |
24 milhões de linhas |
p3 |
|
Conta-chave 4 |
20 milhões de linhas |
p4 |
|
Clientes de pequeno e médio porte |
30 milhões de linhas (combinado) |
p_others |
Cada uma das quatro contas-chave recebe uma partição de lista dedicada para garantir acesso rápido e isolado. Todos os demais clientes são direcionados para p_others, que utiliza três subpartições hash (DEFAULT PARTITIONS 3) para distribuir a carga combinada de forma equilibrada.
CREATE TABLE cust_orders
(
customer_id VARCHAR(36),
year VARCHAR(60),
order_id INT,
order_content TEXT
) PARTITION BY LIST COLUMNS(customer_id)
(
PARTITION p1 VALUES IN ('Key account 1'),
PARTITION p2 VALUES IN ('Key account 2'),
PARTITION p3 VALUES IN ('Key account 3'),
PARTITION p4 VALUES IN ('Key account 4'),
PARTITION p_others DEFAULT PARTITIONS 3 -- catches all other customer_id values; split into 3 hash sub-partitions
);