全部產品
Search
文件中心

:SELECT

更新時間:May 15, 2025

本文介紹查詢時空資料表的文法。

文法

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_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支援人員(DingTalk號: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);

結果顯示ParallelScanPlan on dt by 2 ranges表示最大並行度可以達到2,即開啟並行後查詢效能最高可提升到2倍左右。

常見問題

什麼語句屬於低效查詢語句?

如果SELECT查詢的條件同時滿足下列三個條件,則該查詢被認為是低效查詢。

  • WHERE語句中沒有指定表的第一個主鍵的上下界。

  • WHERE語句中沒有指定索引表中第一個索引列的上下界。

  • WHERE語句中存在非第一個主鍵(或非第一個索引列)的條件。

如何處理低效查詢語句?

解決方案有以下四種。

  • 在查詢語句中增加/*+ _l_allow_filtering_ */,如下語句,表示跳過該檢查,強制執行低效查詢操作。

    SELECT /*+ _l_allow_filtering_ */ * FROM dt WHERE nonPK=100;
  • WHERE語句中增加表的主鍵條件。

  • 修改表的主鍵設計,避免大查詢,具體詳情請參見如何設計寬表主鍵

  • 使用高效能原生二級索引