Todos os produtos
Search
Central de documentação

MaxCompute:Bitmap Index (Beta)

Última atualização: Jul 20, 2026

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.

Nota

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, BETWEEN e IS 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

Nota

Todos os exemplos de sintaxe relacionados ao Bitmap Index utilizam dados das tabelas emp e sale_detail.

Tabelas não particionadas

  1. Crie a tabela emp.

    CREATE TABLE IF NOT EXISTS emp( 
      empno BIGINT, 
      ename STRING, 
      job STRING, 
      mgr BIGINT, 
      sex STRING 
    );
  2. 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

  1. 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);
  2. 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_index na coluna empno da tabela emp.

    CREATE BITMAP INDEX empno_index 
    ON TABLE emp 
    FOR COLUMNS(empno) 
    COMMENT 'idxcomment';
  • Defina um índice chamado job_index para a coluna de cargo job na tabela emp.

    CREATE BITMAP INDEX job_index 
    ON TABLE emp 
    FOR COLUMNS(job) 
    COMMENT 'idxcomment';
  • Gere um índice denominado shop_name_index na coluna shop_name da tabela sale_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;
    Nota

    Em 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

  1. 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       | 
      +------------+------------+------------+------------+------------+
  2. Verifique o impacto do índice.

    1. 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
    2. 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), BitmapIndexInBytes e BitmapIndexOutBytes (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;