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.
Topik
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
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.