本文介绍查询时空数据表的语法。
语法
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
参数说明
SELECT语法中部分参数说明如下:
执行SELECT语句时如果您需要强制选择某条索引,请在查询语句后使用
force index(index_name)
。LIMIT
后只跟一个数字,表示LIMIT限制。如果跟两个由英文逗号(,)分隔的数字,表示OFFSET和LIMIT条数。在SELECT语句中添加
/*+ _l_allow_filtering_ */
,可以强制执行低效查询操作。当执行SELECT语句被Lindorm宽表引擎识别为低效查询时,为了避免这类查询语句给Lindorm带来性能稳定性风险,Lindorm宽表引擎默认不允许执行该类查询,同时会抛出异常。例如Lindorm数据库中存在一张表dt,执行SELECT * FROM dt WHERE nonPK=100;
查询语句,会返回以下异常报错。如果查询语句为低效查询语句,解决方法请参见常见问题。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.
HINT的使用请参见HINT简介。
示例
调用时空函数进行简单查询。时空函数的分类及介绍,请参见函数概览。
SELECT id, ST_AsText(g) FROM gps_data; SELECT id, ST_Buffer(g, 1.0) AS buffer FROM gps_data;
调用时空函数进行条件查询,目前支持
ST_Contains
、ST_DWithin
、ST_DWithinSphere
三种空间条件的高效执行。使用
ST_Contains
函数查询给定空间范围内的点对应的数据。SELECT id FROM gps_data WHERE ST_Contains(ST_GeomFromText('POLYGON((...))'), g);
使用
ST_DWithin
函数查询与中心点在给定平面距离以内的点对应的数据。距离单位:degree。SELECT id FROM gps_data WHERE ST_DWithin(ST_GeomFromText('POINT(0 0)'), g, 100);
使用
ST_DWithinSphere
函数查询与中心点在给定球面距离以内的点对应的数据。距离单位:米。SELECT id FROM gps_data WHERE ST_DWithinSphere(ST_GeomFromText('POINT(0 0)'), g, 100);
如果查询语句为低效查询语句,在查询语句中增加
/*+ _l_allow_filtering_ */
,表示跳过该检查,强制执行低效查询操作。SELECT /*+ _l_allow_filtering_ */ * FROM gps_data WHERE ST_Within(g,ST_GeomFromText('POLYGON((...))'));
如果SELECT查询的条件同时满足以下三个条件,则该查询语句被认为是低效查询语句。
WHERE
语句中没有指定表的第一个主键的上下界。WHERE
语句中没有指定索引表中第一个索引列的上下界。WHERE
语句中存在非第一个主键(或非第一个索引列)的条件。
开启并行查询
开启Lindorm并行查询功能可以使部分宽表引擎的查询性能得到显著提升。
前提条件
宽表引擎为2.7.10.2及以上版本。该功能默认为关闭状态,如需使用请联系Lindorm技术支持(钉钉号:s0s3eg3)。
在宽表引擎2.7.10.2以下的版本中,并行查询为内测功能,使用时可能会占用较多系统资源,建议升级宽表引擎版本。
使用限制
并行查询返回结果会打乱原有的返回顺序,不支持和ORDER BY
一起使用。
使用方法
开启并行查询功能后,您可以在查询语句中添加HINT参数_l_enable_parallel_。系统将根据查询的复杂度,自动采用最优并行度。
SELECT /+_l_enable_parallel_*/ * FROM dt WHERE (id > 0 AND id < 5) OR (id > 6 AND id < 15);
查看并行性能
不同查询的并行效果有差异,您可以通过EXPLAIN语句查看当前查询在系统资源充足情况下能达到的最大并行度。例如:
EXPLAIN SELECT /+_l_enable_parallel_*/ * FROM dt WHERE (id > 0 AND id < 5) OR (id > 6 AND id < 15);
结果显示MultipleScanPlan on dt by 2 ranges
表示最大并行度可以达到2,即开启并行后查询性能最高可提升到2倍左右。
常见问题
什么语句属于低效查询语句?
如果SELECT
查询的条件同时满足下列三个条件,则该查询被认为是低效查询。
WHERE
语句中没有指定表的第一个主键的上下界。WHERE
语句中没有指定索引表中第一个索引列的上下界。WHERE
语句中存在非第一个主键(或非第一个索引列)的条件。
如何处理低效查询语句?
解决方法有以下四种。
- 本页导读 (1)
- 语法
- 参数说明
- 示例
- 开启并行查询
- 前提条件
- 使用限制
- 使用方法
- 常见问题
- 什么语句属于低效查询语句?
- 如何处理低效查询语句?