Este tópico descreve a sintaxe de consulta de dados em uma tabela espaço-temporal.
Sintaxe
SELECT [hint_clause] ( select_clause | '*' )
FROM table_name
[force index(index_name)]
[ WHERE where_clause ]
[ ORDER BY ordering_clause ]
[ LIMIT integer ] | [LIMIT integer, integer]
select_clause ::= selector [ AS identifier ] ( ',' selector [ AS identifier ] )
selector ::= column_name
| term
| function_name '(' [ selector ( ',' selector )* ] ')'
| COUNT '(' '*' ')'
where_clause ::= relation ( AND|OR relation )*
| [st_contains] '(' [ selector ( ',' selector )* ] ')'
relation ::= column_name operator term
'(' column_name ( ',' column_name )* ')' operator tuple_literal
operator ::= '=' | '<' | '>' | '<=' | '>=' | '!=' | IN | IS NOT? NULL
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
Parâmetros
Observe os itens a seguir ao configurar parâmetros em instruções SELECT:
Para forçar o uso de um índice específico na execução da instrução SELECT, adicione
force index(index_name)ao final da instrução.Se LIMIT for seguido por apenas um número, esse valor definirá a quantidade de linhas retornadas. Se LIMIT for seguido por dois números separados por vírgula (,), o primeiro indicará o deslocamento (offset), ou seja, quantas linhas ignorar na consulta, e o segundo especificará o total de linhas a retornar.
-
Para forçar a execução de uma consulta ineficiente, adicione o hint
/*+ _l_allow_filtering_ */ao final da instrução SELECT. Por padrão, se o LindormTable identificar uma consulta como ineficiente, ele não a processará e lançará uma exceção para garantir a estabilidade do desempenho. Por exemplo, considere uma tabela chamada dt no banco de dados Lindorm. Ao executar a instruçãoSELECT * FROM dt WHERE nonPK=100;, o sistema exibirá a seguinte mensagem de erro. Para obter mais informações sobre como resolver consultas ineficientes, consulte FAQ.DoNotRetryIOException: Detect inefficient query: SELECT * FROM dt WHERE nonPK=100 supportEmptyResult true. This query may be a full table scan and thus may have unpredictable performance. Para obter mais informações sobre hints, consulte Visão geral.
Exemplos
-
Use funções espaço-temporais em instruções
SELECTpara realizar consultas simples. Para obter mais informações sobre funções espaço-temporais, consulte Visão geral.SELECT id, ST_AsText(g) FROM gps_data; SELECT id, ST_Buffer(g, 1.0) AS buffer FROM gps_data; -
Use funções espaço-temporais em instruções
SELECTpara realizar consultas simples. Atualmente, é possível executar com eficiência instruções que utilizam as três funções a seguir como condições espaciais:ST_Contains,ST_DWithineST_DWithinSphere.-
Use a função
ST_Containsna instrução para consultar dados correspondentes aos pontos dentro do intervalo espacial especificado.SELECT id FROM gps_data WHERE ST_Contains(ST_GeomFromText('POLYGON((...))'), g); -
Use a função
ST_DWithinna instrução para consultar dados correspondentes aos pontos situados a uma distância plana específica do ponto central. A distância especificada na função é medida em graus.SELECT id FROM gps_data WHERE ST_DWithin(ST_GeomFromText('POINT(0 0)'), g, 100); -
Use a função
ST_DWithinSpherena instrução para consultar dados correspondentes aos pontos situados a uma distância esférica específica do ponto central. A distância especificada na função é medida em metros.SELECT id FROM gps_data WHERE ST_DWithinSphere(ST_GeomFromText('POINT(0 0)'), g, 100);
-
-
Adicione o hint
/*+ _l_allow_filtering_ */ao final de instruções de consulta ineficientes para ignorar a verificação e forçar a execução.SELECT /*+ _l_allow_filtering_ */ * FROM gps_data WHERE ST_Within(g,ST_GeomFromText('POLYGON((...))'));NotaUma consulta SELECT será considerada ineficiente se as condições especificadas na instrução
SELECTatenderem a todos os critérios a seguir:A cláusula
WHEREnão especifica o intervalo de valores da primeira coluna da chave primária da tabela.A cláusula
WHEREnão especifica o intervalo de valores da primeira coluna da chave de índice na tabela de índices.Uma ou mais condições especificadas na cláusula
WHEREnão estão relacionadas à primeira coluna da chave primária ou à primeira coluna da chave de índice.
Ative consultas paralelas
Ative consultas paralelas pode melhorar significativamente o desempenho de consulta de algumas instâncias do LindormTable.
Pré-requisitos
Use o LindormTable versão 2.7.10.2 ou posterior. Esse recurso está desativado por padrão. Para usá-lo, entre em contato com o suporte técnico do Lindorm (ID do DingTalk: s0s3eg3).
Em versões do LindormTable anteriores à 2.7.10.2, esse recurso está em prévia interna e pode consumir recursos significativos do sistema. Recomendamos que você atualize a versão do LindormTable.
Limitações
Consultas paralelas podem retornar resultados em uma ordem diferente e não são compatíveis com a cláusula ORDER BY.
Uso
Após ativar consultas paralelas, use o _l_enable_parallel_ hint na instrução SQL. Nesse caso, o sistema determina automaticamente o número ideal de consultas paralelas com base na complexidade da consulta.
SELECT /*+_l_enable_parallel_*/ * FROM dt WHERE (id > 0 AND id < 5) OR (id > 6 AND id < 15);
Visualize o desempenho paralelo
O desempenho paralelo varia conforme a consulta. Execute a instrução EXPLAIN para visualizar o número máximo de consultas paralelas permitidas quando os recursos do sistema forem suficientes. Exemplo de código:
EXPLAIN SELECT /*+_l_enable_parallel_*/ * FROM dt WHERE (id > 0 AND id < 5) OR (id > 6 AND id < 15);
No resultado, ParallelScanPlan on dt by 2 ranges indica que o número máximo de consultas paralelas permitidas é 2. Ative consultas paralelas pode aumentar o desempenho da consulta em aproximadamente duas vezes.
FAQ
O que é uma consulta ineficiente?
Uma consulta SELECT será considerada ineficiente se as condições especificadas na instrução SELECT atenderem a todos os critérios a seguir.
A cláusula
WHEREnão especifica o intervalo de valores da primeira coluna da chave primária da tabela.A cláusula
WHEREnão especifica o intervalo de valores da primeira coluna da chave de índice na tabela de índices.Uma ou mais condições especificadas na cláusula
WHEREnão estão relacionadas à primeira coluna da chave primária ou à primeira coluna da chave de índice.
O que fazer se minha consulta for identificada como ineficiente?
Use um dos métodos a seguir para resolver esse problema:
-
Adicione o hint
/*+ _l_allow_filtering_ */ao final da instrução de consulta ineficiente para ignorar a verificação e forçar a execução.SELECT /*+ _l_allow_filtering_ */ * FROM dt WHERE nonPK=100; Adicione uma ou mais condições associadas à chave primária da tabela à cláusula
WHERE.Altere a chave primária da tabela para evitar consultas ineficientes. Para obter mais informações, consulte Projetar chaves primárias para tabelas largas do Lindorm.