Mengoptimalkan kinerja kueri - Amazon Quantum Ledger Database (Amazon QLDB)

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Mengoptimalkan kinerja kueri

Amazon QLDB dimaksudkan untuk memenuhi kebutuhan beban kerja pemrosesan transaksi online (OLTP). Ini berarti bahwa QLDB dioptimalkan untuk serangkaian pola kueri tertentu, meskipun mendukung kemampuan query seperti SQL. Sangat penting untuk merancang aplikasi dan model data mereka untuk bekerja dengan pola kueri ini. Jika tidak, seiring pertumbuhan tabel Anda, Anda akan mengalami masalah kinerja yang signifikan, termasuk latensi kueri, batas waktu transaksi, dan konflik konkurensi.

Bagian ini menjelaskan kendala query di QLDB dan memberikan panduan untuk menulis query optimal mengingat kendala ini.

Batas waktu habis transaksi

Dalam QLDB, setiap pernyataan PartiQL (termasuk setiapSELECT permintaan) diproses dalam transaksi dan tunduk pada batas batas waktu transaksi. Transaksi dapat berjalan hingga 30 detik sebelum dilakukan. Setelah batas ini, QLDB menolak setiap pekerjaan yang dilakukan pada transaksi dan membuang sesi yang menjalankan transaksi. Batas ini melindungi klien layanan dari sesi bocor dengan memulai transaksi dan tidak melakukan atau membatalkannya.

Konkurensi Konkurensi

QLDB mengimplementasikan kontrol konkurensi dengan menggunakan kontrol konkurensi optimis (OCC). Kueri suboptimal juga dapat menyebabkan lebih banyak konflik OCC. Untuk informasi tentang OCC, lihatModel Konkurensi Amazon QLDB.

Pola kueri optimal

Sebagai praktik terbaik, Anda harus menjalankan pernyataan dengan klausaWHERE predikat yang menyaring pada bidang yang diindeks atau ID dokumen. QLDB membutuhkan operator kesetaraan (=atauIN) pada bidang diindeks untuk secara efisien mencari dokumen.

Berikut ini adalah contoh pola query yang optimal dalam tampilan pengguna.

--Indexed field (VIN) lookup using the = operator SELECT * FROM VehicleRegistration WHERE VIN = '1N4AL11D75C109151' --Indexed field (VIN) AND non-indexed field (City) lookup SELECT * FROM VehicleRegistration WHERE VIN = '1N4AL11D75C109151' AND City = 'Seattle' --Indexed field (VIN) lookup using the IN operator SELECT * FROM VehicleRegistration WHERE VIN IN ('1N4AL11D75C109151', 'KM8SRDHF6EU074761') --Document ID (r_id) lookup using the BY clause SELECT * FROM VehicleRegistration BY r_id WHERE r_id = '3Qv67yjXEwB9SjmvkuG6Cp'

Setiap kueri yang tidak mengikuti pola-pola ini memanggil pemindaian tabel penuh. Pemindaian tabel dapat menyebabkan batas waktu transaksi untuk kueri pada tabel besar atau kueri yang mengembalikan set hasil yang besar. Mereka juga dapat menyebabkan konflik OCC dengan transaksi yang bersaing.

Indeks kardinalitas tinggi

Kami merekomendasikan bidang pengindeksan yang berisi nilai kardinalitas tinggi. Misalnya,VIN danLicensePlateNumber bidang dalamVehicleRegistration tabel diindeks bidang yang dimaksudkan untuk menjadi unik.

Hindari mengindeks bidang kardinalitas rendah seperti kode status, negara alamat atau provinsi, dan kode pos. Jika Anda mengindeks bidang seperti itu, kueri Anda dapat menghasilkan kumpulan hasil besar yang lebih mungkin menghasilkan batas waktu transaksi atau menyebabkan konflik OCC yang tidak diinginkan.

Kueri tampilan berkomitmen

Kueri yang Anda jalankan dalam tampilan berkomitmen mengikuti pedoman pengoptimalan yang sama dengan kueri tampilan pengguna. Indeks yang Anda buat di atas meja juga digunakan untuk kueri dalam tampilan berkomitmen.

Kueri fungsi sejarah

Kueri fungsi sejarah tidak menggunakan indeks yang Anda buat di atas meja. Riwayat QLDB diindeks oleh ID dokumen saja, dan Anda tidak dapat membuat indeks riwayat tambahan saat ini.

Sebagai praktik terbaik, kualifikasi kueri riwayat dengan rentang tanggal (waktu mulai dan waktu akhir) dan ID dokumen (metadata.id). Kueri riwayat yang menyertakan waktu mulai dan waktu akhir mendapatkan manfaat kualifikasi rentang tanggal.

Kueri gabungan batin

Untuk kueri gabungan dalam, gunakan kriteria gabungan yang mencakup setidaknya bidang yang diindeks untuk tabel di sisi kanan gabungan. Tanpa indeks gabungan, kueri gabungan memanggil beberapa pemindaian tabel—untuk setiap dokumen di tabel kiri gabungan, kueri sepenuhnya memindai tabel yang tepat. Praktik terbaik adalah untuk bergabung pada bidang yang diindeks untuk setiap tabel yang Anda bergabung, selain menentukan predikatWHERE kesetaraan untuk setidaknya satu tabel.

Misalnya, query berikut bergabungVehicleRegistration danVehicle tabel padaVIN bidang masing-masing, yang keduanya diindeks. Query ini juga memiliki predikat kesetaraan padaVehicleRegistration.VIN.

SELECT * FROM VehicleRegistration AS r INNER JOIN Vehicle AS v ON r.VIN = v.VIN WHERE r.VIN IN ('1N4AL11D75C109151', 'KM8SRDHF6EU074761')

Pilih indeks kardinalitas tinggi untuk kriteria gabungan dan predikat kesetaraan dalam kueri gabungan Anda.

Pola kueri yang harus dihindari

Berikut ini adalah beberapa contoh pernyataan suboptimal yang tidak skala baik untuk tabel yang lebih besar di QLDB. Kami sangat menyarankan agar Anda tidak bergantung pada jenis kueri ini untuk tabel yang tumbuh seiring waktu karena kueri Anda pada akhirnya akan menghasilkan batas waktu transaksi. Karena tabel berisi dokumen yang ukurannya bervariasi, sulit untuk menentukan batas yang tepat untuk kueri yang tidak diindeks.

--No predicate clause SELECT * FROM Vehicle --COUNT() is not an optimized function SELECT COUNT(*) FROM Vehicle --Low-cardinality predicate SELECT * FROM Vehicle WHERE Color = 'Silver' --Inequality (>) does not qualify for indexed lookup SELECT * FROM Vehicle WHERE "Year" > 2019 --Inequality (LIKE) SELECT * FROM Vehicle WHERE VIN LIKE '1N4AL%' --Inequality (BETWEEN) SELECT SUM(PendingPenaltyTicketAmount) FROM VehicleRegistration WHERE ValidToDate BETWEEN `2020-01-01T` AND `2020-07-01T` --No predicate clause DELETE FROM Vehicle --No document id, and no date range for the history() function SELECT * FROM history(Vehicle)

Secara umum, kami tidak menyarankan untuk menjalankan jenis pola kueri berikut untuk kasus penggunaan produksi di QLDB:

  • Kueri pemrosesan analitis online (OLAP)

  • Kueri eksplorasi tanpa klausa predikat

  • Kueri pelaporan

  • Pencarian teks

Sebagai gantinya, kami merekomendasikan streaming data Anda ke layanan database yang dibuat khusus yang dioptimalkan untuk kasus penggunaan analitis. Misalnya, Anda dapat melakukan streaming data QLDB ke Amazon OpenSearch Service untuk memberikan kemampuan pencarian teks lengkap melalui dokumen. Untuk contoh aplikasi yang menunjukkan kasus penggunaan ini, lihat GitHub repositori aws-samples/amazon-qldb-streaming-amazon -opensearch-service-sample-python. Untuk informasi tentang aliran QLDB, lihatStreaming data jurnal dari Amazon QLDB.

Memantau kinerja

Driver QLDB menyediakan dikonsumsi I/O penggunaan dan waktu informasi dalam objek hasil pernyataan. Anda dapat menggunakan metrik ini untuk mengidentifikasi pernyataan PartiQL yang tidak efisien. Untuk mempelajari lebih lanjut, lanjutkan keMendapatkan statistik pernyataan PartiQL.

Anda juga dapat menggunakan Amazon CloudWatch untuk melacak kinerja buku besar Anda untuk operasi data. PantauCommandLatency metrik untuk yang ditentukanLedgerName danCommandType. Untuk informasi selengkapnya, lihat Pemantauan CloudWatch dengan Amazon. Untuk mempelajari bagaimana QLDB menggunakan perintah untuk mengelola operasi data, lihatManajemen sesi dengan pengemudi.