Todos os produtos
Search
Central de documentação

PolarDB:Use window functions to accelerate parallel queries

Última atualização: Jun 28, 2026

A função de janela é um recurso introduzido no MySQL Community Edition 8.0 para aprimorar as capacidades de consulta e análise. O PolarDB for MySQL 8.0 oferece suporte total a funções de janela e as executa em paralelo usando vários workers, reduzindo a latência da consulta sem exigir alterações no SQL.

Pré-requisitos

Antes de começar, verifique se você possui:

  • Um cluster do PolarDB for MySQL Cluster Edition 8.0 com versão de revisão 8.0.2.2.0 ou posterior. Para verificar sua versão, consulte Consultar a versão do mecanismo.

  • Uma consulta de função de janela que inclua uma cláusula PARTITION BY. Apenas funções de janela com PARTITION BY oferecem suporte à execução paralela.

Como funciona a execução paralela de funções de janela

O PolarDB paraleliza a execução de funções de janela em três estágios:

  1. Varredura paralela: vários workers varrem a tabela simultaneamente; cada um processa um subconjunto de linhas.

  2. Reparticionamento: os dados são redistribuídos entre os workers por meio de particionamento hash na coluna PARTITION BY. Isso garante o envio de todas as linhas da mesma partição ao mesmo worker, permitindo que cada um calcule a função de janela de forma independente e correta.

  3. Coleta: o nó líder coleta e mescla os resultados de todos os workers.

Verificar a execução paralela

Use EXPLAIN FORMAT=TREE para confirmar se o PolarDB executa uma função de janela em paralelo. Esta é a única sintaxe compatível para inspecionar planos de execução de funções de janela no PolarDB.

Configurar uma tabela de exemplo

Crie uma tabela employee_salaries e insira dados de exemplo:

CREATE TABLE `employee_salaries` (
  `dept` varchar(20) DEFAULT NULL,
  `name` varchar(20) DEFAULT NULL,
  `salary` int DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

INSERT INTO `employee_salaries` VALUES
('Engineering','Dharma',3500),
('Engineering','Bình',3000),
('Engineering','Adalynn',2800),
('Engineering','Samuel',2500),
('Engineering','Cveta',2200),
('Engineering','eve',2000),
('Engineering','Dharma',3500),
('Sales','Carbry',500),
('Sales','Clytemnestra',400),
('Sales','Juraj',300),
('Sales','Kalpana',300),
('Sales','Svantepolk',250),
('Sales','Angelo',200);

Veja abaixo o plano de consulta serial da tabela employee_salaries:

explain format=tree select ROW_NUMBER() OVER(partition by dept order by salary desc) AS 'row_number' from employee_salaries\G
*************************** 1. row ***************************
EXPLAIN:
-> Window aggregate
    -> Sort: employee_salaries.dept, employee_salaries.salary DESC  (cost=1.55 rows=13)
        -> Table scan on employee_salaries

Executar EXPLAIN FORMAT=TREE

explain format=tree select ROW_NUMBER() OVER(partition by dept order by salary desc) AS 'row_number' from employee_salaries\G

Um plano de execução paralela apresenta estrutura semelhante a esta:

*************************** 1. row ***************************
EXPLAIN:
-> Gather (slice: 1; workers: 4)  (cost=26.42 rows=12)
    -> Window aggregate  (cost=15.67 rows=3)
        -> Repartition (hash keys: employee_salaries.dept; slice: 2; workers: 4)  (cost=15.33 rows=3)
            -> Sort: employee_salaries.dept, employee_salaries.salary DESC  (cost=1.55 rows=13)
                -> Parallel table scan on employee_salaries, with parallel partitions: 4

Ler o plano de execução

Cada nó no plano corresponde a um estágio do pipeline paralelo. A execução dos nós ocorre de baixo para cima, ou seja, o nó mais profundo executa primeiro.

Descrição

Parallel table scan on employee_salaries, with parallel partitions: 4

Quatro workers varrem a tabela simultaneamente. Cada worker lida com um subconjunto disjunto de linhas.

Sort: employee_salaries.dept, employee_salaries.salary DESC

Cada worker ordena seus dados locais por dept e salary DESC para preparar o janelamento.

Repartition (hash keys: employee_salaries.dept; slice: 2; workers: 4)

Os dados são redistribuídos entre os quatro workers mediante aplicação de hash em dept (coluna PARTITION BY). Todas as linhas com o mesmo valor de dept vão para o mesmo worker. O parâmetro slice: 2 identifica este como o segundo estágio do pipeline.

Window aggregate

Cada worker calcula independentemente ROW_NUMBER() sobre as partições de departamento atribuídas a ele.

Gather (slice: 1; workers: 4)

O líder coleta os resultados dos quatro workers e os mescla. O marcador slice: 1 indica o estágio final.

workers representa o número de threads paralelas que participam desse estágio. slice é o identificador do estágio do pipeline.

Limitações

Limitação

Detalhes

PARTITION BY obrigatório

Somente funções de janela com cláusula PARTITION BY podem ser executadas em paralelo. Funções de janela sem PARTITION BY são executadas serialmente.