A instrução ANALYZE TABLE coleta estatísticas de colunas de uma tabela. O otimizador de consultas usa essas estatísticas para gerar planos de execução eficientes.
Sintaxe
ANALYZE TABLE <table_name> [PARTITION (<pt_spec>)]
COMPUTE STATISTICS FOR COLUMNS [(<column_name> [, <column_name> ...])];
Omita PARTITION em tabelas não particionadas. Omita a lista de colunas para coletar estatísticas de todas as colunas.
Excluir estatísticas
Para excluir estatísticas em vez de coletá-las:
-- Delete statistics for all columns
ANALYZE TABLE <table_name> DELETE STATISTICS FOR COLUMNS;
-- Delete statistics for specific columns
ANALYZE TABLE <table_name> DELETE STATISTICS FOR COLUMNS (<column_name> [, <column_name> ...]);
Parâmetros
|
Parâmetro |
Descrição |
|
|
Nome da tabela. |
|
|
Nome da coluna a analisar. Omita para analisar todas as colunas. |
|
|
Partição a analisar. Formato: |
Campos de saída das estatísticas
Após executar ANALYZE TABLE, use SHOW STATISTIC para visualizar os resultados. A saída inclui os seguintes campos:
|
Campo |
Aplica-se a |
Descrição |
|
|
Tipos numéricos |
Valor máximo na coluna. |
|
|
Tipos numéricos |
Valor mínimo na coluna. |
|
|
Todos os tipos |
Número de valores distintos (NDV). |
|
|
Todos os tipos |
Quantidade de valores nulos. |
|
|
Todos os tipos |
Até 20 valores com maior frequência de ocorrência. Por exemplo, |
|
|
STRING, VARCHAR |
Comprimento máximo do valor da coluna. |
|
|
STRING, VARCHAR |
Comprimento médio do valor da coluna. |
Exemplos
Coletar estatísticas de uma tabela não particionada
O exemplo mínimo a seguir demonstra a sintaxe básica:
ANALYZE TABLE my_table COMPUTE STATISTICS FOR COLUMNS (col1, col2);
O exemplo completo abaixo cria uma tabela, insere dados, coleta estatísticas e verifica os resultados.
-- Create a non-partitioned table
CREATE TABLE IF NOT EXISTS analyze2_test (
tinyint1 TINYINT,
smallint1 SMALLINT,
int1 INT,
bigint1 BIGINT,
double1 DOUBLE,
decimal1 DECIMAL,
decimal2 DECIMAL(20, 10),
string1 STRING,
varchar1 VARCHAR(10),
boolean1 BOOLEAN,
timestamp1 TIMESTAMP,
datetime1 DATETIME
) LIFECYCLE 30;
-- Insert sample data
INSERT OVERWRITE TABLE analyze2_test
SELECT * FROM VALUES
(1Y, 20S, 4, 8L, 123452.3, 12.4, 52.5, 'str1', 'str21', false, TIMESTAMP '2018-09-17 00:00:00', DATETIME '2018-09-17 00:59:59'),
(10Y, 2S, 7, 11111118L, 67892.3, 22.4, 42.5, 'str12', 'str200', true, TIMESTAMP '2018-09-17 00:00:00', DATETIME '2018-09-16 00:59:59'),
(20Y, 7S, 4, 2222228L, 12.3, 2.4, 2.57, 'str123', 'str2', false, TIMESTAMP '2018-09-18 00:00:00', DATETIME '2018-09-17 00:59:59'),
(null, null, null, null, null, null, null, null, null, null, null, null)
AS t(tinyint1, smallint1, int1, bigint1, double1, decimal1, decimal2, string1, varchar1, boolean1, timestamp1, datetime1);
-- Collect statistics for a single column
ANALYZE TABLE analyze2_test COMPUTE STATISTICS FOR COLUMNS (tinyint1);
-- Collect statistics for multiple columns
ANALYZE TABLE analyze2_test COMPUTE STATISTICS FOR COLUMNS (smallint1, string1, boolean1, timestamp1);
-- Collect statistics for all columns
ANALYZE TABLE analyze2_test COMPUTE STATISTICS FOR COLUMNS;
Verifique os resultados com SHOW STATISTIC:
-- Verify single-column statistics
SHOW STATISTIC analyze2_test COLUMNS (tinyint1);
-- Verify multi-column statistics
SHOW STATISTIC analyze2_test COLUMNS (smallint1, string1, boolean1, timestamp1);
-- Verify all-column statistics
SHOW STATISTIC analyze2_test COLUMNS;
A coluna tinyint1 retorna o seguinte resultado:
ID = 20201126085225150gnqo****
tinyint1:MaxValue: 20
tinyint1:DistinctNum: 4.0
tinyint1:MinValue: 1
tinyint1:NullNum: 1.0
tinyint1:TopK: {1=1.0, 10=1.0, 20=1.0}
Coletar estatísticas de uma tabela particionada
Este exemplo completo cria uma tabela particionada, insere dados em várias partições, coleta estatísticas para uma partição específica e valida os resultados.
-- Create a partitioned table
CREATE TABLE IF NOT EXISTS srcpart_test (
key STRING,
value STRING
)
PARTITIONED BY (ds STRING, hr STRING)
LIFECYCLE 30;
-- Insert data into multiple partitions
INSERT INTO TABLE srcpart_test PARTITION(ds='20201220', hr='11') VALUES
('123', 'val_123'), ('76', 'val_76'), ('447', 'val_447'), ('1234', 'val_1234');
INSERT INTO TABLE srcpart_test PARTITION(ds='20201220', hr='12') VALUES
('3', 'val_3'), ('12331', 'val_12331'), ('42', 'val_42'), ('12', 'val_12');
INSERT INTO TABLE srcpart_test PARTITION(ds='20201221', hr='11') VALUES
('543', 'val_543'), ('2', 'val_2'), ('4', 'val_4'), ('9', 'val_9');
INSERT INTO TABLE srcpart_test PARTITION(ds='20201221', hr='12') VALUES
('23', 'val_23'), ('56', 'val_56'), ('4111', 'val_4111'), ('12333', 'val_12333');
-- Collect statistics for the ds='20201221' partition
ANALYZE TABLE srcpart_test PARTITION(ds='20201221') COMPUTE STATISTICS FOR COLUMNS (key, value);
Valide os resultados:
SHOW STATISTIC srcpart_test PARTITION (ds='20201221') COLUMNS (key, value);
O resultado a seguir apresenta estatísticas detalhadas por subpartição:
ID = 20210105121800689g28p****
(ds=20201221,hr=11) key:MaxLength 3.0
(ds=20201221,hr=11) key:AvgLength: 1.0
(ds=20201221,hr=11) key:DistinctNum: 4.0
(ds=20201221,hr=11) key:NullNum: 0.0
(ds=20201221,hr=11) key:TopK: {2=1.0, 4=1.0, 543=1.0, 9=1.0}
(ds=20201221,hr=11) value:MaxLength 7.0
(ds=20201221,hr=11) value:AvgLength: 5.0
(ds=20201221,hr=11) value:DistinctNum: 4.0
(ds=20201221,hr=11) value:NullNum: 0.0
(ds=20201221,hr=11) value:TopK: {val_2=1.0, val_4=1.0, val_543=1.0, val_9=1.0}
(ds=20201221,hr=12) key:MaxLength 5.0
(ds=20201221,hr=12) key:AvgLength: 3.0
(ds=20201221,hr=12) key:DistinctNum: 4.0
(ds=20201221,hr=12) key:NullNum: 0.0
(ds=20201221,hr=12) key:TopK: {12333=1.0, 23=1.0, 4111=1.0, 56=1.0}
(ds=20201221,hr=12) value:MaxLength 9.0
(ds=20201221,hr=12) value:AvgLength: 7.0
(ds=20201221,hr=12) value:DistinctNum: 4.0
(ds=20201221,hr=12) value:NullNum: 0.0
(ds=20201221,hr=12) value:TopK: {val_12333=1.0, val_23=1.0, val_4111=1.0, val_56=1.0}
Ao analisar uma partição, o MaxCompute retorna estatísticas separadas para cada subpartição no intervalo especificado.