全部产品
Search
文档中心

Lindorm:SELECT

更新时间:Jul 06, 2025

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::=expression

Parameter

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 pernyataan SELECT * 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 SELECT untuk 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 SELECT untuk melakukan query sederhana. Saat ini, pernyataan yang mencakup tiga fungsi berikut sebagai kondisi spasial dapat dieksekusi secara efisien: ST_Contains, ST_DWithin, dan ST_DWithinSphere.

    • Gunakan fungsi ST_Contains dalam 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_DWithin dalam 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_DWithinSphere dalam 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((...))'));
    Catatan

    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 WHERE tidak 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).

Penting

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 WHERE tidak 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.

  • Gunakan indeks sekunder asli berperforma tinggi.