本文介紹查詢時空資料表的文法。
文法
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並行查詢功能可以將時空查詢的效能提升至原來的兩倍以上。一般情況下,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:如果查詢語句為低效查詢語句,應該怎麼解決?