Consulta dados de uma tabela.
Mecanismos aplicáveis
A sintaxe SELECT aplica-se ao LindormTable e ao LindormTSDB.
Limitações
O SELECT suporta apenas consultas planas (tabela única). Não há suporte para consultas com junção de várias tabelas (JOIN) nem para consultas de conjunto (UNION, INTERSECT).
Sintaxe
SELECT [hint_clause] ( select_clause | '*' )
FROM table_name
[ WHERE where_clause ]
[ GROUP BY group_by_clause ]
[ ORDER BY ordering_clause ]
[ LIMIT integer [OFFSET integer] ] | [LIMIT integer, integer]
select_clause ::= selector [ AS identifier ] ( ',' selector [ AS identifier ] )
selector ::= column_name
| term
| function_name '(' [ selector ( ',' selector )* ] ')'
where_clause ::= relation ( AND|OR relation )*
relation ::= column_name operator term
|'(' column_name ( ',' column_name )* ')' operator tuple_literal
operator ::= '=' | '<' | '>' | '<=' | '>=' | '!=' | IN | IS NOT? NULL | LIKE
group_by_clause ::= column_name ( ',' column_name )*
ordering_clause ::= column_name [ ASC | DESC ] ( ',' column_name [ ASC | DESC ] )*
hint_clause::=/*+hint_items*/
hint_items::=hint_item(','hint_item)*
hint_item::=identifier('('hint_option(','hint_option)*')')
hint_option::=expression
Diferenças
A sintaxe SELECT do LindormTable e do LindormTSDB é praticamente idêntica. Contudo, alguns elementos diferem devido aos modelos de dados distintos. A tabela a seguir compara essas diferenças.
|
Elemento de sintaxe |
LindormTable |
LindormTSDB |
|
Cláusula WHERE |
• |
0 |
|
Cláusula SAMPLE BY |
✖️ |
○ |
|
Cláusula GROUP BY |
〇 |
〇 |
|
Cláusula ORDER BY |
〇 |
0 |
|
Cláusula LIMIT |
0 |
0 |
|
HINT |
○ |
• |
Notas de uso
Cláusula SELECT
A cláusula SELECT especifica as colunas, constantes e expressões de função a retornar. Use AS para definir um alias temporário para uma coluna no conjunto de resultados.
Cláusula WHERE
A cláusula WHERE define as condições da consulta.
Consultas em tabelas wide
Para evitar consultas ineficientes em tabelas wide, siga estas regras:
Use apenas a primeira coluna da chave primária ou a primeira coluna de índice da tabela de índices como condição de consulta; OU
Se precisar filtrar por qualquer outra coluna, defina limites superior e inferior para a primeira coluna da chave primária ou para a primeira coluna de índice. O sistema sinaliza e bloqueia por padrão consultas que violem ambas as regras. Para forçar a execução, adicione
/*+ _l_allow_filtering_ */. Consulte Forçar uma consulta ineficiente.
O exemplo a seguir ilustra a diferença entre uma consulta eficiente e uma ineficiente na tabela sensor, que tem device_id como primeira coluna da chave primária:
-- Allowed: first primary key column (device_id) is used as a condition
SELECT * FROM sensor WHERE device_id = 'F07A1260' AND humidity = 20;
-- Not allowed: no bound on device_id; filtering on a non-primary-key column only
-- This query is flagged as inefficient and blocked unless _l_allow_filtering_ is added.
SELECT * FROM sensor WHERE humidity = 20;
Colunas dinâmicas
Se as colunas dinâmicas estiverem habilitadas na tabela wide:
Inclua colunas de chave primária ou de índice na cláusula
WHEREpara garantir o desempenho da consulta.As condições sobre colunas dinâmicas na cláusula
WHEREdevem ser HexStrings.
Para mais informações, consulte Colunas dinâmicas.
Cláusula ORDER BY
Especifica uma ou mais colunas para ordenar o conjunto de resultados.
Toda coluna na cláusula
ORDER BYdeve constar também na cláusula SELECT. Caso contrário, ocorre um erro de verificação semântica.A cláusula
ORDER BYnão aceita aliases.
Cláusula LIMIT
A cláusula LIMIT controla a quantidade de linhas retornadas e permite consultas paginadas.
|
Sintaxe |
Comportamento |
|
|
Retorna |
|
|
Ignora |
|
|
Equivalente a |
Mantenha o OFFSET em no máximo 5.000. Mesmo com OFFSET, a consulta recupera internamente as linhas ignoradas; logo, valores altos aumentam a sobrecarga.
Com colunas dinâmicas habilitadas,
SELECT *exige uma cláusula LIMIT para garantir metadados corretos no conjunto de resultados. O limite máximo padrão é 5.000; exceder esse valor gera erro.
HINT
LindormTable e LindormTSDB aceitam hints para influenciar planos de consulta ou ativar comportamentos específicos. Para detalhes, consulte Visão geral de HINT.
Exemplos
Os exemplos deste tópico usam a seguinte tabela:
CREATE TABLE sensor (
device_id VARCHAR NOT NULL,
region VARCHAR NOT NULL,
time BIGINT NOT NULL,
temperature DOUBLE,
humidity BIGINT,
PRIMARY KEY(device_id, region, time)
);
Consultas simples
-- Select all columns
SELECT * FROM sensor;
-- Select specific columns
SELECT device_id, region, humidity FROM sensor;
-- Limit results with an offset (LIMIT 5, 20 is equivalent)
SELECT * FROM sensor WHERE device_id = 'F07A1260' LIMIT 20 OFFSET 5;
-- Define a column alias
SELECT count(*) AS countRow FROM sensor;
Exemplos de funções espaço-temporais:
-- Return the WKT representation of a geometry column
SELECT id, ST_AsText(g) FROM gps_data;
-- Return a buffered geometry
SELECT id, ST_Buffer(g, 1.0) AS buffer FROM gps_data;
Consultas de agregação
Conte todos os registros do dispositivo F07A1260 em um horário específico:
SELECT count(*) FROM sensor
WHERE device_id = 'F07A1260' AND time = '2021-04-22 15:33:00';
Obtenha a temperatura máxima do dispositivo F07A1260 em um intervalo de tempo:
SELECT max(temperature) AS max_temp FROM sensor
WHERE device_id = 'F07A1260'
AND time >= '2021-04-22 15:33:00'
AND time < '2021-04-22 15:33:20';
Consultas condicionais
Consulte a umidade do dispositivo F07A1260 quando a região e a temperatura atenderem a condições compostas e a umidade não for nula:
SELECT device_id, humidity FROM sensor
WHERE ((region = 'north-cn' AND temperature > 15)
OR (region = 'south-cn' AND temperature > 10))
AND device_id = 'F07A1260'
AND humidity IS NOT NULL;
Consulte dados de vários dispositivos usando IN:
SELECT * FROM sensor WHERE device_id IN ('F07A1260', 'F07A1261');
Consultas condicionais espaço-temporais — as três condições espaciais a seguir permitem execução eficiente:
-- ST_Contains: points inside a polygon
SELECT id FROM gps_data
WHERE ST_Contains(ST_GeomFromText('POLYGON((...))'), g);
-- ST_DWithin: points within a planar distance (unit: degrees)
SELECT id FROM gps_data
WHERE ST_DWithin(ST_GeomFromText('POINT(0 0)'), g, 100);
-- ST_DWithinSphere: points within a spherical distance (unit: meters)
SELECT id FROM gps_data
WHERE ST_DWithinSphere(ST_GeomFromText('POINT(0 0)'), g, 100);
Forçar uma consulta ineficiente
Ao detectar uma instrução SELECT ineficiente, o LindormTable bloqueia a consulta por padrão e gera uma exceção. Esse mecanismo protege o desempenho geral do sistema.
Uma consulta é considerada ineficiente quando todas as condições abaixo forem verdadeiras:
A cláusula
WHEREnão define limites superior e inferior para a primeira coluna da chave primária.A cláusula
WHEREnão define limites superior e inferior para a primeira coluna de índice da tabela de índices.A cláusula
WHEREfiltra por uma coluna que não seja a primeira coluna da chave primária nem a primeira coluna de índice.
Para ignorar a verificação e forçar a execução da consulta, adicione /*+ _l_allow_filtering_ */:
SELECT /*+ _l_allow_filtering_ */ * FROM sensor WHERE humidity = 20;
Para orientações sobre como resolver ou evitar consultas ineficientes, consulte Como resolver ou evitar consultas ineficientes.
Perguntas frequentes
Como resolvo o erro de consulta em tabela wideDoNotRetryIOException: Detect inefficient query:...?
Causa: A mensagem de erro DoNotRetryIOException: Detect inefficient query:... indica que o LindormTable identificou a instrução como uma consulta ineficiente.
O que é uma consulta ineficiente?
Uma consulta SELECT é considerada ineficiente se atender a todas as condições a seguir:
A cláusula
WHEREnão especifica limites superior e inferior para a primeira chave primária da tabela.A cláusula
WHEREnão especifica limites superior e inferior para a primeira coluna de índice da tabela de índices.A cláusula
WHEREcontém uma condição em uma coluna que não seja a primeira chave primária nem a primeira coluna de índice.
Para evitar riscos ao desempenho e à estabilidade do Lindorm, o LindormTable não executa essas consultas por padrão e gera uma exceção.
Exemplo de consulta ineficiente: SELECT * FROM dt WHERE p2=20;
Como evitar consultas ineficientes
Defina a coluna da condição de consulta como a primeira chave primária da tabela. Para mais informações, consulte Projetar chaves primárias para uma tabela wide.
Crie um índice secundário para a coluna da condição de consulta. Para mais informações, consulte Índice secundário.
Otimize as colunas na condição de consulta para que ela não seja classificada como ineficiente.
Como forçar uma consulta ineficiente
Para ignorar a verificação e forçar a execução da consulta, adicione /*+ _l_allow_filtering_ */ à instrução. Veja um exemplo:
SELECT /*+ _l_allow_filtering_ */ * FROM sensor WHERE humidity = 20;