本文介紹查詢時空資料表的文法。
文法
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支援人員(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語句中存在非第一個主鍵(或非第一個索引列)的條件。
如何處理低效查詢語句?
解決方案有以下四種。