全部产品
Search
文档中心

Lindorm:Optimalkan kinerja kueri spatio-temporal

更新时间:Jul 02, 2025

Untuk meningkatkan kinerja kueri spatio-temporal, pastikan kondisi kueri sesuai dengan indeks spatio-temporal yang telah ditentukan sehingga Lindorm tidak perlu memindai seluruh data dalam tabel. Topik ini menjelaskan cara mengoptimalkan kinerja kueri spatio-temporal.

Optimalkan kueri yang hanya berisi kondisi spasio-temporal

Jika kondisi kueri hanya mencakup rentang spasial atau kombinasi rentang spasial dan waktu, Anda dapat menggunakan fungsi pengindeksan Z-ORDER untuk menghasilkan kode spatio-temporal pada kolom spasial atau kolom waktu dalam salah satu format berikut: Z-ORDER(geometry) atau Z-ORDER(geometry,time). Perhatikan hal-hal berikut saat menggunakan fungsi Z-ORDER dalam kueri:

  • Parameter input yang Anda tentukan untuk fungsi Z-ORDER memengaruhi kinerja kueri. Indeks spatio-temporal hanya dapat digunakan jika kondisi kueri mencakup semua kolom yang ditentukan sebagai parameter input dari fungsi Z-ORDER.

  • Jika Anda menggunakan fungsi Z-ORDER untuk menghasilkan kode spatio-temporal pada kolom spasial dan waktu, indeks spatio-temporal hanya dapat digunakan jika batas atas dan bawah rentang waktu ditentukan dalam kondisi kueri.

Tabel berikut menjelaskan bagaimana kinerja kueri dipengaruhi oleh parameter input yang berbeda untuk fungsi pengindeksan Z-ORDER. Dalam pernyataan sampel yang tercantum dalam tabel, kolom g adalah kolom spasial dan kolom t adalah kolom waktu.

Kondisi

Pernyataan

Z-ORDER(g)

Z-ORDER(g,t)

Hanya rentang spasial yang ditentukan.

SELECT id FROM point_table WHERE ST_Contains(ST_GeomFromText('POLYGON((0 0, 0 10, 10 10, 10 0, 0 0))'),g);

Fungsi pengindeksan Z-ORDER(g) dapat digunakan untuk mempercepat kueri.

Fungsi pengindeksan Z-ORDER(g,t) tidak dapat digunakan untuk mempercepat kueri. Untuk menggunakan Z-ORDER(g,t) dalam membuat indeks spatio-temporal guna mempercepat kueri, kondisi kueri harus mencakup rentang spasial dan waktu.

Rentang spasial dan waktu keduanya ditentukan.

SELECT id FROM point_table WHERE ST_Contains(ST_GeomFromText('POLYGON((0 0, 0 10, 10 10, 10 0, 0 0))'),g) AND t>'2021-01-01 08:21:00' AND t<'2021-01-01 08:23:00';

Fungsi pengindeksan Z-ORDER(g,t) dapat digunakan untuk mempercepat kueri.

Fungsi pengindeksan Z-ORDER(g,t) dapat digunakan untuk mempercepat kueri.

SELECT id FROM point_table WHERE ST_Contains(ST_GeomFromText('POLYGON((0 0, 0 10, 10 10, 10 0, 0 0))'),g) AND t > '2021-01-01 08:21:00';

Fungsi pengindeksan Z-ORDER(g,t) dapat digunakan untuk mempercepat kueri.

Fungsi pengindeksan Z-ORDER(g,t) tidak dapat digunakan untuk mempercepat kueri karena batas bawah rentang waktu tidak ditentukan.

Optimalkan kueri yang berisi kondisi spasio-temporal dan lainnya

Jika kondisi kueri berisi kondisi spasio-temporal dan lainnya, kami sarankan Anda membuat indeks komposit untuk mempercepat kueri. Indeks komposit adalah indeks kunci utama atau indeks sekunder di mana fungsi Z-ORDER dan kolom lainnya disertakan, seperti PRIMARY KEY(Z-ORDER(g,t), id). Fungsi Z-ORDER disertakan dalam indeks komposit sebagai kolom karena fungsi Z-ORDER mengembalikan kolom kode spatio-temporal yang sesuai dengan nilai-nilai dalam kolom tertentu. Untuk informasi lebih lanjut tentang indeks komposit di LindormTable, lihat Optimalkan kueri berdasarkan indeks sekunder.

Optimalkan kueri paralel

Jika Anda mengaktifkan kueri paralel, Anda dapat menggunakan sharding untuk meningkatkan paralelisme kueri dan kinerjanya.

Sharding adalah metode untuk membagi data menjadi shard. Anda dapat menerapkan sharding saat membuat indeks spatio-temporal untuk mendistribusikan data ke lebih banyak shard. Sharding juga dapat digunakan untuk menulis data yang berdekatan secara spasial atau temporal ke wilayah berbeda dalam tabel indeks, sehingga data disimpan di shard yang berbeda dalam penyimpanan database.

Anda dapat menggunakan fungsi pengindeksan Z-ORDER dalam format berikut untuk membuat indeks spatio-temporal pada kolom yang menyimpan titik dan menentukan jumlah shard: Z-ORDER(Point, numShards). Parameter numShards menentukan jumlah baris data yang ditulis ke wilayah berbeda dalam tabel indeks. Serangkaian awalan yang berkisar dari 0 hingga numShards-1 secara terpisah ditambahkan ke baris data sebelum ditulis.

Contoh berikut membandingkan kinerja kueri sebelum dan sesudah penerapan sharding saat membuat indeks spatio-temporal.

Kinerja Kueri Sebelum Menggunakan Sharding

  1. Buat tabel spatio-temporal bernama table_noshard untuk tabel sampel yang menyimpan sekitar 150 juta baris data titik tanpa menentukan numShards.

    CREATE TABLE table_noshard(id INT, g GEOMETRY(POINT), name VARCHAR, PRIMARY KEY(Z-ORDER(g)));
  2. Aktifkan kueri paralel untuk table_noshard.

    SELECT /*+_l_enable_parallel_(8)*/ id FROM table_noshard WHERE ST_Contains(ST_GeomFromText('POLYGON((...))'), g);

    Hasilnya menunjukkan bahwa 2.058.894 baris data dikembalikan dalam 10.986 ms.

Kinerja Kueri Setelah Menggunakan Sharding

  1. Buat tabel spatio-temporal bernama table_shard8 untuk tabel sampel yang sama dan atur numShards menjadi 8.

    CREATE TABLE table_shard8(id INT, g GEOMETRY(POINT), name VARCHAR, PRIMARY KEY(Z-ORDER(g, 8)));
  2. Aktifkan kueri paralel untuk table_shard8.

    SELECT /*+_l_enable_parallel_(8)*/ id FROM table_shard8 WHERE ST_Contains(ST_GeomFromText('POLYGON((...))'), g);

    Hasilnya menunjukkan bahwa 2.058.894 baris data dikembalikan dalam 2.501 ms.

Hasilnya menunjukkan bahwa kinerja kueri paralel meningkat signifikan setelah mengonfigurasi numShards.

Optimalkan kueri di mana rentang tidak beraturan ditentukan

Setelah membuat indeks spatio-temporal, jika bentuk rentang kueri sangat berbeda dari kotak pembatas persegi panjang yang ditentukan oleh rentang penyaringan indeks, indeks tersebut hampir tidak dapat meningkatkan kinerja kueri. Gambar berikut menunjukkan contohnya. fanwei

Saat melakukan kueri pada sejumlah besar data, Anda dapat menentukan petunjuk /*+_l_enable_enhanced_filter_*/ untuk mengaktifkan penyaringan indeks yang ditingkatkan.

Sebagai contoh, Anda dapat mengeksekusi pernyataan berikut untuk mengaktifkan penyaringan indeks yang ditingkatkan pada tabel bernama gtest. Dalam contoh ini, indeks spatio-temporal dibuat untuk kolom g, dan POLYGON((...)) menentukan rentang dengan bentuk tidak beraturan.

SELECT /*+_l_enable_enhanced_filter_*/ id FROM gtest WHERE ST_Contains(ST_GeomFromText('POLYGON((...))'), g);
Catatan

Penyaringan indeks yang ditingkatkan tidak diperlukan saat mengkueri sejumlah kecil data, sehingga dinonaktifkan secara default.