SELECT

更新时间:2025-05-07 09:05:39

本文介绍查询时空数据表的语法。

语法

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限制。如果跟两个由英文逗号(,)分隔的数字,表示OFFSETLIMIT条数。

  • 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_ContainsST_DWithinST_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语句中存在非第一个主键(或非第一个索引列)的条件。

如何处理低效查询语句?

解决方法有以下四种。

  • 在查询语句中增加/*+ _l_allow_filtering_ */,如下语句,表示跳过该检查,强制执行低效查询操作。

    SELECT /*+ _l_allow_filtering_ */ * FROM dt WHERE nonPK=100;
  • WHERE语句中增加表的主键条件。

  • 修改表的主键设计,避免大查询,具体详情请参见如何设计宽表主键

  • 使用高性能原生二级索引

  • 本页导读 (1)
  • 语法
  • 参数说明
  • 示例
  • 开启并行查询
  • 前提条件
  • 使用限制
  • 使用方法
  • 常见问题
  • 什么语句属于低效查询语句?
  • 如何处理低效查询语句?