Todos os produtos
Search
Central de documentação

PolarDB:Use the OSS file filter feature to accelerate cold data queries

Última atualização: Jun 28, 2026

O recurso de filtro de arquivos do OSS ignora blocos de dados irrelevantes no OSS durante a execução de consultas, o que reduz o volume de dados verificados e acelera as consultas a dados frios.

Como funciona

Para cada bloco de dados arquivado, o PolarDB coleta estatísticas, gera dados de filtro e os armazena no OSS. Durante a execução de uma consulta, o mecanismo envia as condições para a camada de dados frios em formato CSV, compara-as com os dados de filtro e ignora os blocos que não podem conter linhas correspondentes.

Cada tipo de dado admite diferentes estratégias de filtro:

Estratégia de filtro

Tipos de dados aplicáveis

Mais indicado para

Estatísticas de mínimo/máximo

Numérico, hora

Dados ordenados ou parcialmente ordenados (por exemplo, timestamps, IDs sequenciais)

Mapa de caracteres

String (CHAR, VARCHAR)

Filtragem de prefixo de string sensível a maiúsculas e minúsculas

Filtro Bloom

Todos os tipos de dados

Dados globalmente não ordenados; strings UUID

Em dados de séries temporais — típicos em cenários de arquivamento —, filtrar colunas do tipo tempo pode gerar ganhos significativos de desempenho nas consultas.

Pré-requisitos

Antes de começar, certifique-se de que:

  • O cluster executa o MySQL 8.0.2, versão de revisão 8.0.2.2.25 ou posterior

  • O cluster tem o arquivamento de dados frios ativado

  • Uma conexão com o cluster está estabelecida. Consulte Conectar-se a um cluster

  • A tabela utiliza dados frios do OSS no formato CSV e possui OSS META=1 ativado

Para verificar se OSS META=1 está definido, execute SHOW CREATE TABLE e confirme se a saída contém OSS META=1:

SHOW CREATE TABLE t;

Exemplo de saída:

*************************** 1. row ***************************
       Table: t
Create Table: CREATE TABLE `t` (
  `id` int(11) DEFAULT NULL
) /*!99990 800020213 STORAGE OSS */ ENGINE=CSV DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci /*!99990 800020204 NULL_MARKER='NULL' */ /*!99990 800020223 OSS META=1 */

1 row in set (0.00 sec)

Para mais informações, consulte Executar operações DDL em dados frios.

Limitações

Compatibilidade:

  • Não é possível ativar o recurso de filtro de arquivos do OSS se o Elastic Parallel Query (ePQ) já estiver ativado.

  • A tabela deve conter dados. Tabelas OSS vazias não suportam este recurso para aceleração de consultas.

Tipos de dados suportados:

Categoria

Tipos de dados

Inteiro

TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT, TINYINT UNSIGNED, SMALLINT UNSIGNED, MEDIUMINT UNSIGNED, INT UNSIGNED, BIGINT UNSIGNED

Ponto flutuante

FLOAT, DOUBLE

Ponto fixo

DECIMAL

Tempo

DATE, DATETIME, TIME, TIMESTAMP

String

CHAR, VARCHAR

O filtro Bloom suporta todos os tipos de dados.

Operadores suportados:

Os seguintes operadores acionam o pushdown de filtro: =, <=>, <, <=, >=, >, BETWEEN, LIKE, IS NULL, IS NOT NULL.

No operador LIKE, o caractere curinga de porcentagem (%) deve aparecer apenas no lado direito: LIKE 'ABC%'. Padrões como LIKE '%ABC' ou LIKE '%ABC%' não acionam o pushdown de filtro.

Colunas do tipo string aceitam apenas comparações sensíveis a maiúsculas e minúsculas.

Há suporte para múltiplas condições conectadas por AND. O filtro não avalia condições conectadas por OR.

Padrões que não acionam o pushdown de filtro:

Padrão

Motivo

col LIKE '%ABC' ou col LIKE '%ABC%'

O caractere curinga deve estar apenas no lado direito

condition1 OR condition2

O filtro não avalia condições com OR

Consultas em tabelas OSS vazias

O filtro requer pelo menos uma linha de dados

Ativar o filtro de arquivos do OSS

  1. No console, defina o parâmetro do cluster loose_use_oss_meta como ON para ativar o recurso USE_OSS_META. Para mais informações, consulte Configurar parâmetros de cluster e nó.

  2. Defina o parâmetro do cluster loose_optimizer_switch como ENGINE_CONDITION_PUSHDOWN=ON no console. Para mais informações, consulte Configurar parâmetros de cluster e nó.

  3. Altere o parâmetro do cluster loose_csv_oss_file_filter para ON no console. Para mais informações, consulte Configurar parâmetros de cluster e nó.

  4. Conecte-se ao cluster e verifique se os três parâmetros estão ativos:

    -- Verify that oss_file_filter is ON
    SHOW VARIABLES LIKE 'oss_file_filter';
    
    -- Verify that use_oss_meta is ON
    SHOW VARIABLES LIKE 'use_oss_meta';
    
    -- Verify that ENGINE_CONDITION_PUSHDOWN is ON
    SHOW VARIABLES LIKE 'optimizer_switch';

Criar um filtro de arquivos do OSS

Use a opção OSS_FILE_FILTER ao arquivar uma tabela ou em uma instrução ALTER TABLE em uma tabela já arquivada.

Sintaxe da opção:

OSS_FILE_FILTER = 'field_filter[,field_filter]'
field_filter := field_name[:filter_type]
filter_type := bloom

Por padrão, colunas numéricas e de tempo usam estatísticas de mínimo/máximo, enquanto colunas de string usam o mapa de caracteres. Para aplicar um filtro Bloom em uma coluna, adicione :bloom ao nome da coluna.

Para valores UUID armazenados em colunas de string, utilize um filtro Bloom ( :bloom ) para obter maior eficiência na filtragem.

Criar um filtro ao arquivar uma tabela

Especifique OSS_FILE_FILTER como parte da instrução ALTER TABLE ... ENGINE = CSV STORAGE OSS:

-- Archive the table and create an OSS file filter on L_ORDERKEY, L_LINENUMBER, and L_SHIPDATE
ALTER TABLE lineitem ENGINE = CSV STORAGE OSS
  OSS_FILE_FILTER = 'L_ORDERKEY,L_LINENUMBER,L_SHIPDATE';

Definição completa da tabela utilizada neste exemplo:

CREATE TABLE `lineitem` (
  `L_ORDERKEY` int(11) NOT NULL,
  `L_PARTKEY` int(11) NOT NULL,
  `L_SUPPKEY` int(11) NOT NULL,
  `L_LINENUMBER` int(11) NOT NULL,
  `L_QUANTITY` decimal(15,2) NOT NULL,
  `L_EXTENDEDPRICE` decimal(15,2) NOT NULL,
  `L_DISCOUNT` decimal(15,2) NOT NULL,
  `L_TAX` decimal(15,2) NOT NULL,
  `L_RETURNFLAG` char(1) COLLATE utf8_bin NOT NULL,
  `L_LINESTATUS` char(1) COLLATE utf8_bin NOT NULL,
  `L_SHIPDATE` date NOT NULL,
  `L_COMMITDATE` date NOT NULL,
  `L_RECEIPTDATE` date NOT NULL,
  `L_SHIPINSTRUCT` char(25) COLLATE utf8_bin NOT NULL,
  `L_SHIPMODE` char(10) COLLATE utf8_bin NOT NULL,
  `L_COMMENT` varchar(44) COLLATE utf8_bin NOT NULL
) ENGINE = innodb;

Adicionar um filtro a uma tabela já arquivada

Execute ALTER TABLE com OSS_FILE_FILTER em uma tabela que já esteja no formato CSV STORAGE OSS:

-- Add an OSS file filter to an archived table
-- L_SHIPINSTRUCT uses a Bloom filter; the other columns use the default strategy
ALTER TABLE lineitem OSS_FILE_FILTER = 'L_ORDERKEY,L_LINENUMBER,L_SHIPDATE,L_SHIPINSTRUCT:BLOOM';

A definição de tabela para uma tabela já arquivada usa ENGINE = CSV STORAGE OSS:

CREATE TABLE `lineitem` (
  `L_ORDERKEY` int(11) NOT NULL,
  `L_PARTKEY` int(11) NOT NULL,
  `L_SUPPKEY` int(11) NOT NULL,
  `L_LINENUMBER` int(11) NOT NULL,
  `L_QUANTITY` decimal(15,2) NOT NULL,
  `L_EXTENDEDPRICE` decimal(15,2) NOT NULL,
  `L_DISCOUNT` decimal(15,2) NOT NULL,
  `L_TAX` decimal(15,2) NOT NULL,
  `L_RETURNFLAG` char(1) COLLATE utf8_bin NOT NULL,
  `L_LINESTATUS` char(1) COLLATE utf8_bin NOT NULL,
  `L_SHIPDATE` date NOT NULL,
  `L_COMMITDATE` date NOT NULL,
  `L_RECEIPTDATE` date NOT NULL,
  `L_SHIPINSTRUCT` char(25) COLLATE utf8_bin NOT NULL,
  `L_SHIPMODE` char(10) COLLATE utf8_bin NOT NULL,
  `L_COMMENT` varchar(44) COLLATE utf8_bin NOT NULL
) ENGINE = CSV STORAGE OSS;

Verificar o pushdown de filtro

Após criar um filtro de arquivos do OSS, execute EXPLAIN para confirmar se as condições do filtro estão sendo enviadas para a camada de dados do OSS.

EXPLAIN SELECT * FROM lineitem WHERE l_orderkey = 96;

A saída deve incluir With pushed engine condition na coluna Extra:

+----+-------------+----------+------------+------+---------------+------+---------+------+---------+----------+---------------------------------------------------------------------------------+
| id | select_type | table    | partitions | type | possible_keys | key  | key_len | ref  | rows    | filtered | Extra                                                                           |
+----+-------------+----------+------------+------+---------------+------+---------+------+---------+----------+---------------------------------------------------------------------------------+
|  1 | SIMPLE      | lineitem | NULL       | ALL  | NULL          | NULL | NULL    | NULL | 6001215 |    10.00 | Using where; With pushed engine condition (`test`.`lineitem`.`L_ORDERKEY` = 96) |
+----+-------------+----------+------------+------+---------------+------+---------+------+---------+----------+---------------------------------------------------------------------------------+

Para obter um plano em formato de árvore que mostre explicitamente quais condições de filtro são aplicadas à varredura de dados do OSS:

EXPLAIN FORMAT = TREE SELECT * FROM lineitem WHERE l_orderkey = 96\G

Saída esperada:

*************************** 1. row ***************************
EXPLAIN: -> Filter: (lineitem.L_ORDERKEY = 96)  (cost=15010.00 rows=10000)
    -> Table scan on lineitem, extra (oss_file_filter conditions: (lineitem.L_ORDERKEY = 96))  (cost=15010.00 rows=100000)

A entrada oss_file_filter conditions confirma que a condição é avaliada no nível do bloco de dados, ignorando blocos sem correspondência antes que sejam carregados na memória.

Após confirmar o filtro, execute a consulta real:

SELECT COUNT(*) FROM lineitem WHERE l_orderkey = 96;

Próximos passos