Topik ini menjelaskan sintaks yang digunakan untuk mengambil data dalam tabel data spatio-temporal.
Sintaks
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::=expressionParameter
Perhatikan hal-hal berikut saat mengonfigurasi parameter dalam pernyataan SELECT:
Untuk memaksa sistem memilih indeks tertentu saat pernyataan SELECT dijalankan, tambahkan
force index(index_name)di akhir pernyataan.Jika LIMIT diikuti oleh satu angka, angka tersebut menentukan jumlah baris yang akan dikembalikan.Jika LIMIT diikuti oleh dua angka yang dipisahkan koma (,), angka pertama adalah nilai offset yang menentukan jumlah baris dilewati dalam query, dan angka kedua menentukan jumlah baris yang akan dikembalikan.Untuk memaksa sistem melakukan query tidak efisien, tambahkan hint
/*+ _l_allow_filtering_ */di akhir pernyataan SELECT. Secara default, LindormTable tidak memproses query SELECT yang dianggap tidak efisien dan melempar pengecualian untuk menjaga performa yang stabil. Sebagai contoh, jika Anda menjalankan pernyataanSELECT * FROM dt WHERE nonPK=100;pada tabel bernama dt dalam database Lindorm, pesan kesalahan akan dikembalikan. Untuk informasi lebih lanjut tentang solusi untuk query tidak efisien, lihat FAQ.DoNotRetryIOException: Mendeteksi query yang tidak efisien: SELECT * FROM dt WHERE nonPK=100 supportEmptyResult true. Query ini mungkin merupakan pemindaian tabel penuh dan karenanya dapat memiliki performa yang tidak terduga.Untuk informasi lebih lanjut tentang hint, lihat Ikhtisar.
Contoh
Gunakan fungsi spatio-temporal dalam pernyataan
SELECTuntuk melakukan query sederhana. Untuk informasi lebih lanjut tentang fungsi spatio-temporal, lihat Ikhtisar.SELECT id, ST_AsText(g) FROM gps_data; SELECT id, ST_Buffer(g, 1.0) AS buffer FROM gps_data;Gunakan fungsi spatio-temporal dalam pernyataan
SELECTuntuk melakukan query sederhana. Saat ini, pernyataan yang mencakup tiga fungsi berikut sebagai kondisi spasial dapat dieksekusi secara efisien:ST_Contains,ST_DWithin, danST_DWithinSphere.Gunakan fungsi
ST_Containsdalam pernyataan untuk mengambil data yang sesuai dengan titik-titik dalam rentang spasial tertentu.SELECT id FROM gps_data WHERE ST_Contains(ST_GeomFromText('POLYGON((...))'), g);Gunakan fungsi
ST_DWithindalam pernyataan untuk mengambil data yang sesuai dengan titik-titik dalam jarak bidang tertentu dari titik pusat. Jarak yang ditentukan dalam fungsi diukur dalam derajat.SELECT id FROM gps_data WHERE ST_DWithin(ST_GeomFromText('POINT(0 0)'), g, 100);Gunakan fungsi
ST_DWithinSpheredalam pernyataan untuk mengambil data yang sesuai dengan titik-titik dalam jarak bola tertentu dari titik pusat. Jarak yang ditentukan dalam fungsi diukur dalam meter.SELECT id FROM gps_data WHERE ST_DWithinSphere(ST_GeomFromText('POINT(0 0)'), g, 100);
Tambahkan hint
/*+ _l_allow_filtering_ */di akhir pernyataan query tidak efisien untuk melewati pemeriksaan query dan memaksa eksekusi pernyataan tersebut.SELECT /*+ _l_allow_filtering_ */ * FROM gps_data WHERE ST_Within(g,ST_GeomFromText('POLYGON((...))'));CatatanJika kondisi query yang ditentukan dalam pernyataan
SELECTmemenuhi semua kondisi berikut, query SELECT dianggap tidak efisien:Rentang nilai kolom kunci utama pertama dalam tabel Anda tidak ditentukan dalam klausa
WHERE.Rentang nilai kolom kunci indeks pertama dalam tabel indeks Anda tidak ditentukan dalam klausa
WHERE.Satu atau lebih kondisi yang ditentukan dalam klausa
WHEREtidak terkait dengan kolom kunci utama pertama atau kolom kunci indeks pertama.
Aktifkan query paralel
Dengan mengaktifkan query paralel, Anda dapat meningkatkan performa query beberapa instance LindormTable secara signifikan.
Prasyarat
LindormTable 2.7.10.2 atau versi lebih baru digunakan. Fitur ini dinonaktifkan secara default. Untuk menggunakan fitur ini, hubungi dukungan teknis Lindorm (ID DingTalk: s0s3eg3).
Pada versi LindormTable sebelum 2.7.10.2, fitur ini dalam pratinjau internal dan mungkin mengonsumsi sumber daya sistem yang signifikan. Kami merekomendasikan Anda untuk memperbarui versi LindormTable.
Batasan
Query paralel mungkin mengembalikan hasil dalam urutan yang berbeda dan tidak dapat digunakan bersamaan dengan klausa ORDER BY.
Penggunaan
Setelah mengaktifkan query paralel, Anda dapat menggunakan hint _l_enable_parallel_ hint dalam pernyataan SQL Anda. Dalam hal ini, sistem secara otomatis menentukan jumlah optimal query paralel berdasarkan kompleksitas query.
SELECT /*+_l_enable_parallel_*/ * FROM dt WHERE (id > 0 AND id < 5) OR (id > 6 AND id < 15);Lihat Performa Paralel
Performa paralel bervariasi dengan query. Anda dapat menjalankan pernyataan EXPLAIN untuk melihat jumlah maksimum query paralel yang diizinkan ketika sumber daya sistem mencukupi. Contoh kode:
EXPLAIN SELECT /*+_l_enable_parallel_*/ * FROM dt WHERE (id > 0 AND id < 5) OR (id > 6 AND id < 15);Dalam hasilnya, ParallelScanPlan on dt by 2 ranges menunjukkan bahwa jumlah maksimum query paralel yang diizinkan adalah 2. Mengaktifkan query paralel dapat meningkatkan performa query hingga dua kali lipat.
FAQ
Apa itu query yang tidak efisien?
Jika kondisi query yang ditentukan dalam pernyataan SELECT memenuhi semua kondisi berikut, query SELECT dianggap tidak efisien:
Rentang nilai kolom kunci utama pertama dalam tabel Anda tidak ditentukan dalam klausa
WHERE.Rentang nilai kolom kunci indeks pertama dalam tabel indeks Anda tidak ditentukan dalam klausa
WHERE.Satu atau lebih kondisi yang ditentukan dalam klausa
WHEREtidak terkait dengan kolom kunci utama pertama atau kolom kunci indeks pertama.
Apa yang dapat saya lakukan jika query saya diidentifikasi sebagai query yang tidak efisien?
Anda dapat menggunakan salah satu metode berikut untuk menyelesaikan masalah ini:
Tambahkan hint
/*+ _l_allow_filtering_ */di akhir pernyataan query tidak efisien untuk melewati pemeriksaan query dan memaksa eksekusi pernyataan tersebut.SELECT /*+ _l_allow_filtering_ */ * FROM dt WHERE nonPK=100;Tambahkan satu atau lebih kondisi yang terkait dengan kunci utama tabel Anda ke dalam klausa
WHERE.Ubah kunci utama tabel Anda untuk mencegah query yang tidak efisien. Untuk informasi lebih lanjut, lihat Desain kunci utama untuk tabel lebar Lindorm.