Mengoptimalkan kinerja kueri - Database Buku Besar Amazon Quantum (AmazonQLDB)

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

Mengoptimalkan kinerja kueri

penting

Pemberitahuan akhir dukungan: Pelanggan yang ada akan dapat menggunakan Amazon QLDB hingga akhir dukungan pada 07/31/2025. Untuk detail selengkapnya, lihat Memigrasi QLDB Buku Besar Amazon ke Amazon Aurora Postgre. SQL

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

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

Batas batas waktu transaksi

DalamQLDB, setiap pernyataan PartiQL (termasuk SELECT setiap kueri) diproses dalam transaksi dan tunduk pada batas waktu tunggu transaksi. Transaksi dapat berjalan hingga 30 detik sebelum dilakukan. Setelah batas ini, QLDB tolak setiap pekerjaan yang dilakukan pada transaksi dan buang sesi yang menjalankan transaksi. Batas ini melindungi klien layanan dari sesi bocor dengan memulai transaksi dan tidak melakukan atau membatalkannya.

Konflik konkurensi

QLDBmengimplementasikan kontrol konkurensi dengan menggunakan kontrol konkurensi optimis (). OCC Pertanyaan suboptimal juga dapat menyebabkan lebih banyak konflik. OCC Untuk informasi tentang OCC, lihat Model QLDB konkurensi Amazon.

Pola kueri yang optimal

Sebagai praktik terbaik, Anda harus menjalankan pernyataan dengan klausa WHERE predikat yang memfilter pada bidang yang diindeks atau ID dokumen. QLDBmemerlukan operator kesetaraan (=atauIN) pada bidang yang diindeks untuk mencari dokumen secara efisien.

Berikut ini adalah contoh pola kueri 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 ini memanggil pemindaian tabel lengkap. Pemindaian tabel dapat menyebabkan batas waktu transaksi untuk kueri pada tabel besar atau kueri yang mengembalikan set hasil besar. Mereka juga dapat menyebabkan OCC konflik dengan transaksi yang bersaing.

Indeks kardinalitas tinggi

Kami merekomendasikan bidang pengindeksan yang berisi nilai kardinalitas tinggi. Misalnya, LicensePlateNumber bidang VIN dan dalam VehicleRegistration tabel adalah bidang yang diindeks yang dimaksudkan untuk menjadi unik.

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

Kueri tampilan yang berkomitmen

Kueri yang Anda jalankan dalam tampilan komited mengikuti pedoman pengoptimalan yang sama seperti kueri tampilan pengguna. Indeks yang Anda buat pada tabel juga digunakan untuk kueri dalam tampilan komited.

Kueri fungsi sejarah

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

Sebagai praktik terbaik, kualifikasikan kueri riwayat dengan rentang tanggal (waktu mulai dan waktu akhir) dan ID dokumen (metadata.id). Pertanyaan sejarah yang mencakup waktu mulai dan waktu akhir mendapatkan manfaat dari 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 kanan. Praktik terbaik adalah bergabung di bidang yang diindeks untuk setiap tabel yang Anda ikuti, selain menentukan predikat WHERE kesetaraan untuk setidaknya satu tabel.

Misalnya, kueri berikut bergabung dengan VehicleRegistration dan Vehicle tabel di VIN bidangnya masing-masing, yang keduanya diindeks. Kueri ini juga memiliki predikat kesetaraan pada. VehicleRegistration.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 diskalakan dengan 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 menjalankan jenis pola kueri berikut untuk kasus penggunaan produksi diQLDB:

  • Permintaan pemrosesan analitik online (OLAP)

  • Kueri eksplorasi tanpa klausa predikat

  • Melaporkan pertanyaan

  • Pencarian teks

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

Memantau kinerja

QLDBPengemudi menyediakan informasi penggunaan dan waktu I/O yang dikonsumsi 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. Pantau CommandLatency metrik untuk yang ditentukan LedgerName danCommandType. Untuk informasi selengkapnya, lihat Pemantauan CloudWatch dengan Amazon. Untuk mempelajari cara QLDB menggunakan perintah untuk mengelola operasi data, lihatManajemen sesi dengan pengemudi.