Gerenciamento de Particionamento de Tabelas e Funções de Janela no SQL

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).

Tags: SQL database-partitioning window-functions analytic-functions oracle-sql

Publicado em 6-25 19:57