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 comPARTITION BYoferecem 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:
Varredura paralela: vários workers varrem a tabela simultaneamente; cada um processa um subconjunto de linhas.
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.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.
|
Nó |
Descrição |
|
|
Quatro workers varrem a tabela simultaneamente. Cada worker lida com um subconjunto disjunto de linhas. |
|
|
Cada worker ordena seus dados locais por |
|
|
Os dados são redistribuídos entre os quatro workers mediante aplicação de hash em |
|
|
Cada worker calcula independentemente |
|
|
O líder coleta os resultados dos quatro workers e os mescla. O marcador |
workersrepresenta o número de threads paralelas que participam desse estágio.sliceé o identificador do estágio do pipeline.
Limitações
|
Limitação |
Detalhes |
|
|
Somente funções de janela com cláusula |