全部產品
Search
文件中心

Lindorm:SELECT

更新時間:Jul 06, 2024

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

文法

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並行查詢功能可以將時空查詢的效能提升至原來的兩倍以上。一般情況下,Lindorm並行查詢能力預設為關閉狀態,請提交工單開啟並行查詢功能。開啟並行查詢功能後,需要通過HINT設定_l_enable_parallel_參數,為每條SQL語句指定並行度。如果不指定並行度,則該條SQL語句無法使用並行查詢能力。更多資訊,請參見HINT簡介

使用限制

如果查詢使用索引回查主表功能,那麼將無法使用並行查詢能力。通常建議在建立索引時將查詢所需列冗餘,避免回查主表。

樣本

  • 採用預設最大並行度

    說明

    並行查詢能力預設為關閉狀態,請提交工單開啟並行查詢功能。

    不指定並行度時,系統會根據查詢複雜度,自動採用最優的並行度。

    SELECT /*+_l_enable_parallel_*/ id FROM gps_data WHERE ST_Contains(ST_GeomFromText('POLYGON((...))'), g);
  • 自訂並行度

    如下樣本設定自訂並行度為8時,那麼最大的並行度為8。

    SELECT /*+_l_enable_parallel_(8)*/ id FROM gps_data WHERE ST_Contains(ST_GeomFromText('POLYGON((...))'), g);
    說明
    • 自訂並行度必須為大於等於1的整數,如果自訂並行度超過預設最大並行度,則採用預設最大並行度。

    • 當您不知道並行度設定成多少合適時,建議不指定並行度,系統將自動採用最優的並行度。

常見問題

  • Q:什麼情況下,查詢語句被認為是低效查詢語句?

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

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

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

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

  • Q:如果查詢語句為低效查詢語句,應該怎麼解決?

    A:解決方案有以下四種。

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

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

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

    • 使用高效能原生二級索引,具體詳情請參見二級索引