Particionamento Físico de Tabelas
O particionamento de tabelas permite dividir uma tabela grande em partes menores e mais gerenciáveis com base em colunas específicas, melhorando o desempenho de consultas e a manutenção de dados.
Criando Partições por Lista
Abaixo está um exemplo de como criar uma tabela particionada utilizando o método de lista, baseado no status de um registro:
CREATE TABLE registros (
id INT,
descricao VARCHAR(255),
status VARCHAR(20)
)
PARTITION BY LIST (status) (
PARTITION p_aberto VALUES ('ABERTO'),
PARTITION p_fechado VALUES ('FECHADO'),
PARTITION p_padrao VALUES (DEFAULT)
);
Operações com Partições
É possível consultar, remover e adicionar partições conforme a necessidade do negócio.
-- Consultar dados de uma partição específica
SELECT * FROM registros PARTITION (p_aberto);
-- Remover uma partição existente
ALTER TABLE registros DROP PARTITION p_fechado;
-- Adicionar uma nova partição
-- Nota: Se a partição DEFAULT existir, ela deve ser removida antes de adicionar novas partições com valores específicos.
ALTER TABLE registros DROP PARTITION p_padrao;
ALTER TABLE registros ADD PARTITION p_cancelado VALUES ('CANCELADO');
ALTER TABLE registros ADD PARTITION p_padrao VALUES (DEFAULT);
Ao utilizar particionamento por lista, é altamente recomendável criar uma partição DEFAULT. Isso garante que inserções de valores não mapeados explicitamente não falhem, comportando-se de maneira similar ao MAXVALUE usado em partições por intervalo (range).
Funções de Janela e o PRATITION BY
No contexto de funções analíticas (ou de janela), a cláusula PARTITION BY é utilizada dentro da função OVER(). Ela divide o conjunto de resultados em partições lógicas para aplicar a função analítica de forma independente em cada grupo.
A sintaxe básica é OVER(PARTITION BY coluna_grupo ORDER BY coluna_ordenacao). Esta cláusula não pode ser usada sozinha; deve ser combinada com funções como ROW_NUMBER(), RANK(), DENSE_RANK(), SUM(), LAG() ou LEAD().
SELECT
nome_funcionario,
departamento,
salario,
RANK() OVER (PARTITION BY departamento ORDER BY salario DESC) AS posicao_ranking
FROM funcionarios;
Diferenças entre PARTITION BY e GROUP BY
Embora ambos lidem com agrupamentos, seus propósitos e resultados são distintos:
- GROUP BY: Utilizado para agregação. Ele colapsa as linhas que possuem os mesmos valores nas colunas especificadas em uma única linha de resumo (ex: calcular o salário médio por departamento). O número total de linhas no conjunto de resultados é reduzido.
- PARTITION BY: Utilizado em funções de janela. Ele divide logicamente o conjunto de resultados em grupos, mas não reduz o número de linhas retornadas. Cada linha individual é mantida, e o cálculo da função é aplicado dentro do seu respectivo grupo (ex: classificar os funcionários por salário dentro de cada departamento, mantendo todos os registros).
Funções de Classificação (Ranking)
Ao ordenar dados dentro das partições, é comum o uso de funções de classificação. Entender a diferença entre elas é crucial:
- ROW_NUMBER(): Atribui um número sequencial único e contínuo para cada linha dentro da partição (1, 2, 3, 4), independentemente de haver valores duplicados na ordenação.
- RANK(): Atribui a mesma posição para valores iguais, mas o próximo número na sequência será saltado. Se houver dois primeiros lugares, o próximo será o terceiro (1, 1, 3, 4).
- DENSE_RANK(): Semelhante ao
RANK(), atribui a mesma posição para valores iguais, mas a sequência não sofre saltos. Se houver dois primeiros lugares, o próximo será o segundo (1, 1, 2, 3).