O mecanismo SQL do Tablestore otimiza consultas selecionando o melhor índice para leitura de dados e realizando o pushdown de computações para a camada de índice.
Seleção de índice
Quando uma tabela de dados possui um Secondary index ou um Search index, o mecanismo SQL escolhe o caminho de leitura ideal antes de executar a consulta. A seleção do índice pode ocorrer automaticamente ou ser especificada manualmente.
Antes de utilizar a otimização de consultas, certifique-se de ter criado os mapeamentos da tabela de dados. Para mais informações, consulte DDL operations. Para acelerar consultas com um search index, crie também o search index e seu respectivo mapeamento.
Regras de seleção automática
Ao consultar um mapeamento de tabela de dados, o mecanismo SQL seleciona automaticamente um índice com base na seguinte prioridade:
|
Prioridade |
Destino |
Condição |
|
1 |
Search index |
Todas as colunas nas cláusulas WHERE, de agregação e ORDER BY são cobertas pelo mesmo search index. Exemplo: |
|
2 |
Secondary index |
O secondary index corresponde a mais colunas iniciais da chave primária na cláusula WHERE do que a tabela de dados (correspondência de prefixo mais à esquerda) e cobre todas as colunas da consulta. Exemplo: A tabela de dados tem chaves primárias a e b. Um secondary index tem chaves primárias c, a e b. Para |
|
3 |
Decisão do CBO |
Caso nenhuma das regras anteriores se aplique, o mecanismo SQL utiliza o CBO interno (Otimizador Baseado em Custo) para escolher a opção de menor custo entre a tabela de dados e os secondary indexes. |
Se o mapeamento estiver configurado com consistência forte ou exigir resultados de agregação exatos, o mecanismo SQL não selecionará automaticamente um search index.
Quando tanto um secondary index quanto um search index cobrem todas as colunas necessárias, o mecanismo SQL dá preferência ao search index.
Especificar manualmente um índice
Para utilizar um índice específico, especifique-o manualmente de uma das seguintes formas:
Sintaxe use index
Especifique um índice na instrução SELECT.
-- Force a full table scan (skip all indexes)
SELECT * FROM sampletable use index();
-- Use a search index
SELECT * FROM sampletable use index(sampletable_search_index);
-- Use a secondary index
SELECT * FROM sampletable use index(sampletable_secondary_index);
Caso o índice especificado não cubra as colunas necessárias, o mecanismo SQL lê automaticamente os dados ausentes diretamente da tabela de dados.
Tabela de mapeamento de índice
Consulte diretamente a tabela de mapeamento de um secondary index ou search index.
-- Query through a search index mapping table (only columns in the index are queryable)
SELECT col_a, col_b FROM search_index_mapping WHERE col_a > 10;
Consultas em uma tabela de mapeamento de índice retornam apenas as colunas incluídas nesse índice.
Recomendações
|
Cenário |
Recomendação |
|
Agregação, ordenação ou busca textual completa |
Utilize a seleção automática (padrão). Garanta que o search index cubra todas as colunas necessárias. O mecanismo SQL encaminha a consulta para o search index e aplica o pushdown dos operadores automaticamente. |
|
Filtros simples de igualdade ou intervalo com consistência forte |
Opte por um secondary index. Secondary indexes suportam leituras fortemente consistentes quando dados em tempo real são obrigatórios. |
|
A seleção automática gera resultados inesperados |
Especifique manualmente um índice com |
|
Apenas colunas presentes no índice são necessárias |
Consulte diretamente a tabela de mapeamento do índice para evitar leituras na tabela de dados. |
Pushdown de computação
O mecanismo SQL envia os operadores suportados para a camada do search index, reduzindo o volume de dados que precisa processar.
Condições de ativação
O pushdown de computação exige que o search index cubra todas as colunas da instrução SQL, incluindo as colunas SELECT, WHERE, ORDER BY e GROUP BY. Se alguma coluna estiver ausente, o mecanismo SQL recorre a uma varredura completa da tabela.
-- Table has columns a, b, c, d. Search index covers a, b, c.
-- d is not in the search index → full table scan, no pushdown
SELECT a, b, c, d FROM exampletable;
-- All columns are in the search index → reads through search index, pushdown supported
SELECT a, b, c FROM exampletable;
Operadores suportados
|
Tipo de operador |
Suporte a pushdown |
Condições |
|
Operadores lógicos |
AND, OR |
NOT não suporta pushdown. |
|
Operadores relacionais |
=, !=, <, <=, >, >=, BETWEEN...AND |
Apenas comparações entre coluna e constante são suportadas. Comparações entre colunas não permitem pushdown, pois os search indexes criam índices independentes por coluna e não conseguem resolver comparações cruzadas na camada de índice. |
|
Funções de agregação |
MIN, MAX, COUNT, AVG, SUM, ANY_VALUE, COUNT(DISTINCT), GROUP BY |
Os argumentos devem ser nomes de colunas, não expressões. COUNT(*) suporta pushdown. |
|
Ordenação e paginação |
ORDER BY col LIMIT n |
Os argumentos do ORDER BY devem ser nomes de colunas. Expressões no ORDER BY não permitem pushdown. |
|
Funções vetoriais |
VECTOR_QUERY_FLOAT32 |
Todas as demais expressões na cláusula WHERE também devem atender às condições de pushdown. Caso alguma expressão não atenda, a consulta não poderá ser executada. |
Antipadrões comuns
|
Antipadrão |
Padrão corrigido |
Motivo |
|
|
A coluna a é BIGINT. A incompatibilidade de tipos aciona um CAST implícito. |
|
|
O argumento da agregação é uma expressão. |
|
|
O argumento do GROUP BY é uma expressão. |
|
Não há reescrita equivalente. Aplique o filtro na camada da aplicação. |
Comparação entre colunas. |
|
|
O argumento do ORDER BY é uma expressão. |
Mapeamento entre expressões SQL e recursos do search index
A tabela a seguir associa expressões SQL aos recursos equivalentes de consulta do search index, facilitando a migração do SDK do search index para SQL.
|
Expressão SQL |
Exemplo |
Recurso do search index |
|
Sem cláusula WHERE |
SELECT * FROM t |
|
|
= |
a = 1 |
|
|
>, >=, <, <= |
a > 1 |
|
|
IS NULL / IS NOT NULL |
a IS NULL |
|
|
AND / OR / NOT / != |
a = 1 AND b = 2 |
|
|
LIKE |
a LIKE "%s%" |
|
|
IN |
a IN (1,2,3) |
|
|
TEXT_MATCH |
TEXT_MATCH(a, "hello") |
|
|
TEXT_MATCH_PHRASE |
TEXT_MATCH_PHRASE(a, "hello world") |
|
|
ARRAY_EXTRACT |
ARRAY_EXTRACT(col) |
|
|
NESTED_QUERY |
NESTED_QUERY(expr) |
|
|
ORDER BY / LIMIT |
ORDER BY a LIMIT 10 |
|
|
Funções de agregação / GROUP BY |
SUM(col) / GROUP BY col |