Este tema describe la sintaxis que se utiliza para consultar datos en una tabla espaciotemporal.
Sintaxis
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
Tenga en cuenta los siguientes puntos cuando configure parámetros en las instrucciones SELECT:
Si desea forzar al sistema a seleccionar un índice específico durante la ejecución de la instrucción SELECT, agregue
force index(index_name)al final de la instrucción.Si a LIMIT le sigue un solo número, este indica la cantidad de filas que se devolverán. Si a LIMIT le siguen dos números separados por una coma (,), el primero representa el valor de desplazamiento, es decir, cuántas filas se omitirán en la consulta. El segundo número especifica la cantidad de filas que se devolverán.
-
Para obligar al sistema a ejecutar una consulta ineficiente, agregue el hint
/*+ _l_allow_filtering_ */al final de la instrucción SELECT. Cuando LindormTable determina que una consulta SELECT es ineficiente, no la procesa de forma predeterminada y lanza una excepción para mantener estable el rendimiento. Por ejemplo, si su base de datos Lindorm almacena una tabla llamada dt y usted ejecuta la instrucciónSELECT * FROM dt WHERE nonPK=100;, se devuelve el siguiente mensaje de error. Para conocer la solución a una consulta ineficiente, 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 obtener más información sobre los hints, consulte Overview.
Ejemplos
-
Utilice funciones espaciotemporales en las instrucciones
SELECTpara ejecutar consultas sencillas. Para obtener más información sobre estas funciones, consulte Overview.SELECT id, ST_AsText(g) FROM gps_data; SELECT id, ST_Buffer(g, 1.0) AS buffer FROM gps_data; -
Emplee funciones espaciotemporales en las instrucciones
SELECTpara ejecutar consultas sencillas. Actualmente, el sistema ejecuta de manera eficiente las instrucciones que incluyen las tres funciones siguientes como condiciones espaciales:ST_Contains,ST_DWithinyST_DWithinSphere.-
Incluya la función
ST_Containsen la instrucción para consultar los datos correspondientes a los puntos dentro del rango espacial especificado.SELECT id FROM gps_data WHERE ST_Contains(ST_GeomFromText('POLYGON((...))'), g); -
Agregue la función
ST_DWithina la instrucción para consultar los datos de los puntos ubicados a la distancia plana indicada desde el punto central. La distancia que se especifica en esta función se mide en grados.SELECT id FROM gps_data WHERE ST_DWithin(ST_GeomFromText('POINT(0 0)'), g, 100); -
Use la función
ST_DWithinSphereen la instrucción para consultar los datos de los puntos situados a la distancia esférica indicada desde el punto central. La distancia que se especifica en esta función se mide en metros.SELECT id FROM gps_data WHERE ST_DWithinSphere(ST_GeomFromText('POINT(0 0)'), g, 100);
-
-
Agregue el hint
/*+ _l_allow_filtering_ */al final de las instrucciones de consulta ineficientes para omitir la validación y ejecutarlas de forma forzosa.SELECT /*+ _l_allow_filtering_ */ * FROM gps_data WHERE ST_Within(g,ST_GeomFromText('POLYGON((...))'));NotaUna consulta SELECT se considera ineficiente cuando las condiciones de consulta especificadas en la instrucción
SELECTcumplen todos los criterios siguientes:La cláusula
WHEREno especifica el rango de valores de la primera columna de clave principal de la tabla.La cláusula
WHEREno especifica el rango de valores de la primera columna de clave de índice de la tabla de índices.Una o más condiciones de la cláusula
WHEREno están relacionadas con la primera columna de clave principal ni con la primera columna de clave de índice.
Habilitar consultas paralelas
Al habilitar las consultas paralelas, mejora notablemente el rendimiento de algunas instancias de LindormTable.
Requisitos previos
Se requiere LindormTable 2.7.10.2 o una versión posterior. Esta función está deshabilitada de forma predeterminada. Para utilizarla, comuníquese con el soporte técnico de Lindorm (ID de DingTalk: s0s3eg3).
En versiones de LindormTable anteriores a la 2.7.10.2, esta función se encuentra en vista previa interna y puede consumir recursos significativos del sistema. Se recomienda upgrade the LindormTable version.
Límites
Las consultas paralelas pueden devolver resultados en un orden distinto, por lo que no son compatibles con la cláusula ORDER BY.
Uso
Una vez habilitadas las consultas paralelas, utilice hint _l_enable_parallel_ en su instrucción SQL. De este modo, el sistema determina automáticamente la cantidad óptima de consultas paralelas según la complejidad de la consulta.
SELECT /*+_l_enable_parallel_*/ * FROM dt WHERE (id > 0 AND id < 5) OR (id > 6 AND id < 15);
Consultar el rendimiento paralelo
El rendimiento paralelo varía según la consulta. Ejecute la instrucción EXPLAIN para consultar la cantidad máxima de consultas paralelas permitidas cuando los recursos del sistema son suficientes. A continuación se muestra un ejemplo de código:
EXPLAIN SELECT /*+_l_enable_parallel_*/ * FROM dt WHERE (id > 0 AND id < 5) OR (id > 6 AND id < 15);
En el resultado, ParallelScanPlan on dt by 2 ranges indica que la cantidad máxima de consultas paralelas permitidas es 2. Habilitar las consultas paralelas aumenta el rendimiento aproximadamente al doble.
Preguntas frecuentes
¿Qué es una consulta ineficiente?
Una consulta SELECT se considera ineficiente cuando las condiciones de consulta especificadas en la instrucción SELECT cumplen todos los criterios siguientes:
La cláusula
WHEREno especifica el rango de valores de la primera columna de clave principal de la tabla.La cláusula
WHEREno especifica el rango de valores de la primera columna de clave de índice de la tabla de índices.Una o más condiciones de la cláusula
WHEREno están relacionadas con la primera columna de clave principal ni con la primera columna de clave de índice.
¿Qué debo hacer si mi consulta se identifica como ineficiente?
Utilice uno de los métodos siguientes para resolver este problema:
-
Agregue el hint
/*+ _l_allow_filtering_ */al final de la instrucción de consulta ineficiente para omitir la validación y ejecutarla de forma forzosa.SELECT /*+ _l_allow_filtering_ */ * FROM dt WHERE nonPK=100; Agregue una o más condiciones asociadas con la clave principal de la tabla a la cláusula
WHERE.Modifique la clave principal de la tabla para evitar consultas ineficientes. Para obtener más información, consulte Design primary keys for Lindorm wide tables.