O Bitmap Index é um novo tipo de índice que permite a criação de índices em colunas com alta cardinalidade repetida, oferecendo recursos eficientes para consultas pontuais e de intervalo. Este tópico descreve como utilizar o tipo de índice Bitmap Index no MaxCompute.
Informações gerais
Atualmente, o MaxCompute oferece quatro tipos de índice: Hash Clustering, Range Clustering, Bloomfilter Index e Bitmap Index. Todos eles fornecem capacidade de filtragem para consultas pontuais. Enquanto o Range Clustering exige o princípio de correspondência mais à esquerda para ativar a filtragem por intervalo, e o Bloomfilter Index é ideal para cenários de consulta pontual, o Bitmap Index foca principalmente em consultas de intervalo. Nesse contexto, ele consegue filtrar mais de 60% dos dados, acelerando significativamente as consultas.
Principais vantagens do Bitmap Index:
Cada consulta ao Bitmap Index opera de forma independente, sem restrições relacionadas ao princípio de correspondência mais à esquerda.
Compatibilidade com múltiplas colunas. É possível criar um Bitmap Index em uma ou mais colunas da tabela e combiná-lo com outros índices para otimizar ainda mais o desempenho das consultas.
Alta eficiência na filtragem. Ao gerar um bitmap para cada valor, o Bitmap Index permite que os resultados da filtragem sejam precisos até o nível da linha, apresentando excelente desempenho em cenários com alta repetição de valores e distribuição compacta de dados.
Indicado para operações de união e interseção (OR e AND), otimizando consultas multidimensionais.
Cenários de uso
Recomendado para colunas com alta repetição de valores e um conjunto limitado de opções distintas, como gênero ou cidade.
Ideal para executar operações lógicas, como AND e OR, permitindo realizar operações bit a bit no Bitmap de maneira eficiente.
Se a cardinalidade for muito alta ou a filtragem da consulta não for eficaz, o índice pode consumir espaço de armazenamento excessivo e degradar o desempenho de leitura. Por isso, evite criar um Bitmap Index nas seguintes colunas:
Colunas com baixa repetição de valores, como números de CPF ou telefones celulares.
Colunas que exigem atualizações ou modificações frequentes.
Faturamento
Armazenamento: A construção do índice consome espaço adicional. O sistema calcula esse consumo com base no tamanho real do índice e o soma ao uso de armazenamento de dados do projeto para fins de faturamento, aplicando o mesmo preço do armazenamento padrão.
Computação: A criação do índice aciona tarefas computacionais extras, aumentando o consumo de recursos. Em planos pré-pagos, o sistema utiliza diretamente os recursos pré-pagos do projeto. Em planos pós-pagos, o custo das tarefas de computação relacionadas ao índice segue a fórmula:
SQL后付费单价*复杂度1*索引相关任务输入数据量.
Limites de uso
No momento, há suporte apenas para tipos não aninhados: STRING, CHAR, VARCHAR, TINYINT, SMALLINT, INT, BIGINT e DOUBLE.
Acelera as seguintes condições de consulta:
<=,<,=,>,>=,IN,BETWEENeIS NULL.
Considerações importantes
Antes de criar um Bitmap Index, execute o comando
setproject odps.schema.evolution.enable=true;para ativar a evolução de esquema (Schema Evolution).O sistema permite criar um Bitmap Index para apenas uma coluna por vez. Para indexar várias colunas de uma tabela, execute a instrução de criação separadamente para cada coluna.
Após a criação do índice, o sistema gera automaticamente o Bitmap Index durante a inserção de novos dados na tabela.
Para aplicar o Bitmap Index aos dados existentes, reconstrua o índice.
Dados de exemplo
Todos os exemplos de sintaxe relacionados ao Bitmap Index utilizam dados das tabelas emp e sale_detail.
Tabelas não particionadas
-
Crie a tabela
emp.CREATE TABLE IF NOT EXISTS emp( empno BIGINT, ename STRING, job STRING, mgr BIGINT, sex STRING ); -
Insira os dados.
INSERT INTO emp(empno,ename,job,mgr,sex) VALUES (7369,'smith','clerk',7902,'Male'), (7499,'allen','salesman',7698,'Female'), (7521,'ward','salesman',7698,'Male'), (7654,'martin','salesman',7698,'Male'), (7698,'blake','manager',7839,'Male'), (7782,'clark','manager',7839,'Male'), (7788,'scott','analyst',7566,'Male'), (7839,'king','president',NULL,'Male'), (7844,'turner','salesman',7698,'Female'), (7876,'adams','clerk',7788,'Female'), (7900,'james','clerk',7698,'Male'), (7902,'ford','analyst',7566,'Male'), (7934,'miller','clerk',7782,'Female');
Tabelas particionadas
-
Crie a tabela particionada
sale_detail.CREATE TABLE IF NOT EXISTS sale_detail( shop_name STRING, customer_id STRING, total_price DOUBLE) PARTITIONED BY (sale_date STRING, region STRING); -
Adicione partições.
ALTER TABLE sale_detail ADD PARTITION (sale_date='2023', region='china') PARTITION (sale_date='2024', region='shanghai');
Criar um Bitmap Index
Sintaxe
CREATE BITMAP INDEX <index_name> ON TABLE <table_name> FOR COLUMNS(<col_name>) [COMMENT 'indexcomment'];
Descrição dos parâmetros
index_name: Obrigatório. Nome do índice.
table_name: Obrigatório. Nome da tabela.
col_name: Obrigatório. Nome da coluna onde o índice será criado.
Exemplos
-
Crie um índice chamado
empno_indexna colunaempnoda tabelaemp.CREATE BITMAP INDEX empno_index ON TABLE emp FOR COLUMNS(empno) COMMENT 'idxcomment'; -
Defina um índice chamado
job_indexpara a coluna de cargojobna tabelaemp.CREATE BITMAP INDEX job_index ON TABLE emp FOR COLUMNS(job) COMMENT 'idxcomment'; -
Gere um índice denominado
shop_name_indexna colunashop_nameda tabelasale_detail.CREATE BITMAP INDEX shop_name_index ON TABLE sale_detail FOR COLUMNS(shop_name) COMMENT 'indexcomment';
Reconstruir um Bitmap Index
Sintaxe
Utilize os comandos abaixo para regenerar o Bitmap Index em dados já existentes.
-
Reconstrução para tabelas não particionadas.
ALTER TABLE <table_name> REBUILD BITMAP INDEX; -
Reconstrução para tabelas particionadas.
ALTER TABLE <table_name> PARTITION (<partition_name1=value1>[, partition_name2=value2, ...]) REBUILD BITMAP INDEX;NotaEm tabelas particionadas, a reconstrução ocorre em apenas uma partição por vez.
Descrição dos parâmetros
-
Tabelas não particionadas
table_name: Obrigatório. Nome da tabela.
-
Tabelas particionadas
table_name: Obrigatório. Nome da tabela.
partition_name: Obrigatório. Nome da partição.
value: Obrigatório. Valor da partição.
Exemplos
-
Exemplo 1: Tabela não particionada.
ALTER TABLE emp REBUILD BITMAP INDEX; -
Exemplo 2: Tabela particionada.
ALTER TABLE sale_detail PARTITION (sale_date='2023', region='china') REBUILD BITMAP INDEX;
Consultar um Bitmap Index
Sintaxe
SHOW INDEXES ON <table_name>;
Descrição dos parâmetros
table_name: Obrigatório. Nome da tabela.
Exemplo
--查看emp表上的索引
SHOW INDEXES ON emp;
Visualize o resultado retornado semelhante ao seguinte.
{"Indexes": [{
"id": "00c84b0e9e6e4097bdfe3a01b91848ac",
"indexColumns": [{"name": "job"}],
"name": "job_index",
"properties": {"comment": "jobidx"},
"type": "BITMAP"},
{
"id": "18a9755c7a8a4182a6b51165e786aa62",
"indexColumns": [{"name": "empno"}],
"name": "empno_index",
"properties": {"comment": "idxcomment"},
"type": "BITMAP"}]}
Consultar dados e verificar o efeito do Bitmap Index
-
Exemplos de consulta
-
Exemplo 1: Consulta pontual na coluna de cargo
job.SELECT * FROM emp WHERE job = 'clerk';Resultado retornado:
+------------+-------+-----+------------+------------+-----+ | empno | ename | job | mgr | hiredate | sex | +------------+-------+-----+------------+------------+-----+ | 7369 | smith | clerk | 7902 | NULL | Male | | 7876 | adams | clerk | 7788 | NULL | Female | | 7900 | james | clerk | 7698 | NULL | Male | | 7934 | miller | clerk | 7782 | NULL | Female | +------------+-------+-----+------------+------------+-----+ -
Exemplo 2: Consulta por intervalo na coluna
empno.SELECT * FROM emp WHERE empno BETWEEN 7300 AND 7800;Resultado retornado:
+------------+------------+------------+------------+------------+ | empno | ename | job | mgr | sex | +------------+------------+------------+------------+------------+ | 7369 | smith | clerk | 7902 | Male | | 7499 | allen | salesman | 7698 | Female | | 7521 | ward | salesman | 7698 | Male | | 7654 | martin | salesman | 7698 | Male | | 7698 | blake | manager | 7839 | Male | | 7782 | clark | manager | 7839 | Male | | 7788 | scott | analyst | 7566 | Male | +------------+------------+------------+------------+------------+
-
-
Verifique o impacto do índice.
-
Nos logs de execução do console, clique no link Log view para acessar a página LogView.
2024-11-05 16:46:42 start to get jobId: 2024-11-05 16:46:42 get jobId:20241105084642689g10x9kj2im1 ID = 20241105084642689g10x9kj2im1 Log view: http://logview.odps.aliyun.com/logview/?h=http://service.cn i01t7IkFjd6lvbI16wyJvZHBz0J1JYhQiXSwIRuZmW0N1oiQwsb3ciLC Job Queueing... Summary: resource cost: cpu 0.00 Core * Min, memory 0.00 GB * Min -
Na seção JSON Summary da página LogView, pesquise pela palavra-chave Bitmap. Isso exibe a eficácia da filtragem proporcionada pelo Bitmap Index e o tempo adicional gasto na construção do índice (excluindo o tempo de E/S).
Os campos métricos relevantes incluem
BitmapIndexFilteredRowCount(linhas filtradas),BitmapIndexLatency(tempo de construção),BitmapIndexInByteseBitmapIndexOutBytes(bytes de entrada e saída).
-
Excluir um Bitmap Index
Sintaxe
DROP INDEX [IF EXISTS] <index_name> ON TABLE <table_name>;
Descrição dos parâmetros
index_name: Obrigatório. Nome do índice.
table_name: Obrigatório. Nome da tabela.
Exemplo
DROP INDEX IF EXISTS job_index ON TABLE emp;