このトピックでは、時空間テーブルのデータをクエリするために使用される構文について説明します。
構文
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)を文の最後に追加します。If LIMIT の後に 1 つの数字のみが続く場合、この数字は返される行数を指定します。LIMIT の後にコンマ (,) で区切られた 2 つの数字が続く場合、最初の数字はクエリでスキップされる行数を指定するオフセット値であり、2 番目の数字はクエリで返される行数を指定します。システムに非効率的なクエリの実行を強制するには、SELECT 文の最後に
/*+ _l_allow_filtering_ */ヒントを追加します。LindormTable は、SELECT クエリが非効率的なクエリであると判断した場合、デフォルトではクエリを処理せず、安定したパフォーマンスを確保するために例外をスローします。たとえば、dt という名前のテーブルが Lindorm データベースに格納されているとします。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.ヒントの詳細については、「概要」をご参照ください。
例
簡単なクエリを実行するには、
SELECT文で時空間関数を使用します。時空間関数の詳細については、「概要」をご参照ください。SELECT id, ST_AsText(g) FROM gps_data; SELECT id, ST_Buffer(g, 1.0) AS buffer FROM gps_data;簡単なクエリを実行するには、
SELECT文で時空間関数を使用します。現在、空間条件として次の 3 つの関数を含む文を効率的に実行できます。ST_Contains、ST_DWithin、ST_DWithinSphere。指定された空間範囲内の点に対応するデータをクエリするには、文で
ST_Contains関数を使用します。SELECT id FROM gps_data WHERE ST_Contains(ST_GeomFromText('POLYGON((...))'), g);中心点から指定された平面距離内にある点に対応するデータをクエリするには、文で
ST_DWithin関数を使用します。関数で指定された距離は度単位で測定されます。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文で指定されたクエリ条件が次のすべての条件を満たす場合、SELECT クエリは非効率的と見なされます。WHERE句で、テーブルの最初のプライマリキー列の値の範囲が指定されていません。WHERE句で、インデックステーブルの最初のインデックスキー列の値の範囲が指定されていません。WHERE句で指定された 1 つ以上の条件が、最初のプライマリキー列または最初のインデックスキー列に関連付けられていません。
並列クエリを有効にする
並列クエリを有効にすることで、一部の LindormTable インスタンスのクエリパフォーマンスを大幅に向上させることができます。
前提条件
LindormTable 2.7.10.2 以降を使用しています。この機能はデフォルトで無効になっています。この機能を使用するには、Lindorm テクニカルサポート(DingTalk ID: s0s3eg3)に連絡してください。
LindormTable 2.7.10.2 より前のバージョンでは、この機能は内部プレビュー段階にあり、システムリソースを大量に消費する可能性があります。LindormTable のバージョンをアップグレードすることをお勧めします。
制限
並列クエリは結果を異なる順序で返す場合があり、ORDER BY 句と一緒に使用することはできません。
使用方法
並列クエリを有効にした後、SQL 文で _l_enable_parallel_ ヒント を使用できます。この場合、システムはクエリの複雑さに基づいて最適な並列クエリ数を自動的に決定します。
SELECT /*+_l_enable_parallel_*/ * FROM dt WHERE (id > 0 AND id < 5) OR (id > 6 AND id < 15);並列パフォーマンスを表示する
並列パフォーマンスはクエリによって異なります。Browse to your newly created web app.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 文で指定されたクエリ条件が次のすべての条件を満たす場合、SELECT クエリは非効率的と見なされます。
WHERE句で、テーブルの最初のプライマリキー列の値の範囲が指定されていません。WHERE句で、インデックステーブルの最初のインデックスキー列の値の範囲が指定されていません。WHERE句で指定された 1 つ以上の条件が、最初のプライマリキー列または最初のインデックスキー列に関連付けられていません。
クエリが非効率的なクエリとして識別された場合はどうすればよいですか?
この問題を解決するには、次のいずれかの方法を使用できます。
クエリチェックをスキップして文を強制的に実行するには、非効率的なクエリ文の最後に
/*+ _l_allow_filtering_ */ヒントを追加します。SELECT /*+ _l_allow_filtering_ */ * FROM dt WHERE nonPK=100;テーブルのプライマリキーに関連付けられた 1 つ以上の条件を
WHERE句に追加します。非効率的なクエリを防ぐために、テーブルのプライマリキーを変更します。詳細については、「Lindorm ワイドテーブルのプライマリキーを設計する」をご参照ください。
パフォーマンス専有型ネイティブセカンダリインデックスを使用します。