Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Optimalkan kueri CloudTrail Danau
Halaman ini memberikan panduan tentang cara mengoptimalkan kueri CloudTrail Danau untuk meningkatkan kinerja dan keandalan. Ini mencakup teknik pengoptimalan khusus serta solusi untuk kegagalan kueri umum.
Rekomendasi untuk mengoptimalkan kueri
Ikuti rekomendasi di bagian ini untuk mengoptimalkan kueri Anda.
Rekomendasi:
Optimalkan agregasi
Mengecualikan kolom redundan dalam GROUP BY klausa dapat meningkatkan kinerja karena lebih sedikit kolom membutuhkan lebih sedikit memori. Misalnya, dalam query berikut, kita dapat menggunakan arbitrary fungsi pada kolom redundan seperti eventType untuk meningkatkan kinerja. arbitraryFungsi pada eventType digunakan untuk memilih nilai bidang secara acak dari grup karena nilainya sama dan tidak perlu disertakan dalam GROUP
BY klausa.
SELECT eventName, eventSource, arbitrary(eventType), count(*) FROM $EDS_ID GROUP BY eventName, eventSource
Dimungkinkan untuk meningkatkan kinerja GROUP BY fungsi dengan mengurutkan daftar bidang dalam urutan penurunan jumlah nilai uniknya (kardinalitas). GROUP BY Misalnya, saat mendapatkan jumlah peristiwa dari suatu tipe di masing-masing Wilayah AWS, kinerja dapat ditingkatkan dengan menggunakan awsRegion urutaneventName, dalam GROUP
BY fungsi alih-alihawsRegion, eventName karena ada nilai yang lebih unik eventName daripada yang adaawsRegion.
SELECT eventName, awsRegion, count(*) FROM $EDS_ID GROUP BY eventName, awsRegion
Gunakan teknik aproksimasi
Setiap kali nilai yang tepat tidak diperlukan untuk menghitung nilai yang berbeda, gunakan fungsi agregat perkiraanapprox_distinctCOUNT(DISTINCT fieldName) operasi.
Batasi hasil kueri
Jika hanya respons sampel yang diperlukan untuk kueri, batasi hasilnya ke sejumlah kecil baris dengan menggunakan LIMIT kondisi. Jika tidak, kueri akan mengembalikan hasil yang besar dan membutuhkan lebih banyak waktu untuk eksekusi kueri.
Menggunakan LIMIT bersama dengan ORDER BY dapat memberikan hasil untuk catatan N atas atau bawah lebih cepat karena mengurangi jumlah memori yang dibutuhkan dan waktu yang dibutuhkan untuk mengurutkan.
SELECT * FROM $EDS_ID ORDER BY eventTime LIMIT 100;
Optimalkan kueri LIKE
Anda dapat menggunakan LIKE untuk menemukan string yang cocok, tetapi dengan string panjang, ini adalah komputasi intensif. regexp_like
Seringkali, Anda dapat mengoptimalkan pencarian dengan menambatkan substring yang Anda cari. Misalnya, jika Anda mencari awalan, lebih baik menggunakan 'substr%' daripada '% substr %' dengan LIKE operator dan '^substr' dengan fungsinya. regexp_like
Gunakan UNION ALL alih-alih UNION
UNION ALLdan UNION dua cara untuk menggabungkan hasil dari dua kueri menjadi satu hasil tetapi UNION menghapus duplikat. UNIONperlu memproses semua catatan dan menemukan duplikat, yang merupakan memori dan komputasi intensif, tetapi UNION ALL merupakan operasi yang relatif cepat. Kecuali Anda perlu menghapus duplikat catatan, gunakan UNION ALL untuk kinerja terbaik.
Sertakan hanya kolom yang diperlukan
Jika Anda tidak memerlukan kolom, jangan sertakan dalam kueri Anda. Semakin sedikit data yang harus diproses oleh kueri, semakin cepat ia akan berjalan. Jika Anda memiliki kueri yang dilakukan SELECT
* di kueri terluar, Anda harus mengubah * ke daftar kolom yang Anda butuhkan.
ORDER BYKlausa mengembalikan hasil query dalam urutan diurutkan. Saat menyortir jumlah data yang lebih besar, jika memori yang diperlukan tidak tersedia, hasil yang diurutkan menengah ditulis ke disk yang dapat memperlambat eksekusi kueri. Jika Anda tidak benar-benar membutuhkan hasil Anda untuk diurutkan, hindari menambahkan ORDER
BY klausa. Selain itu, hindari ORDER BY menambahkan kueri batin jika tidak benar-benar diperlukan.
Kurangi ruang lingkup fungsi jendela
Fungsi jendelaPARTITION BY klausa.
Terkadang kueri dengan fungsi jendela dapat ditulis ulang tanpa fungsi jendela. Misalnya, alih-alih menggunakan row_number ataurank, Anda dapat menggunakan fungsi agregat seperti max_bymin_by
Kueri berikut menemukan alias yang terakhir ditugaskan ke setiap kunci KMS menggunakan. max_by
SELECT element_at(requestParameters, 'targetKeyId') as keyId, max_by(element_at(requestParameters, 'aliasName'), eventTime) as mostRecentAlias FROM $EDS_ID WHERE eventsource = 'kms.amazonaws.com' AND eventName in ('CreateAlias', 'UpdateAlias') AND eventTime > DATE_ADD('week', -1, CURRENT_TIMESTAMP) GROUP BY element_at(requestParameters, 'targetKeyId')
Dalam hal ini, max_by fungsi mengembalikan alias untuk catatan dengan waktu acara terbaru dalam grup. Kueri ini berjalan lebih cepat dan menggunakan lebih sedikit memori daripada kueri setara dengan fungsi jendela.
Solusi untuk kegagalan kueri
Bagian ini menyediakan solusi untuk kegagalan kueri umum.
Kueri gagal karena responsnya terlalu besar
Kueri dapat gagal jika responsnya terlalu besar sehingga menghasilkan pesanQuery response is too large. Jika ini terjadi, Anda dapat mengurangi cakupan agregasi.
Fungsi agregasi seperti array_agg dapat menyebabkan setidaknya satu baris dalam respons kueri menjadi sangat besar menyebabkan kueri gagal. Misalnya, menggunakan array_agg(eventName) instead of array_agg(DISTINCT
eventName) akan meningkatkan ukuran respons banyak karena nama acara yang digandakan dari CloudTrail peristiwa yang dipilih.
Kueri gagal karena kehabisan sumber daya
Jika memori yang cukup tidak tersedia selama pelaksanaan operasi intensif memori seperti gabungan, agregasi dan fungsi jendela, hasil antara tumpah ke disk, tetapi tumpahan memperlambat eksekusi kueri dan tidak cukup untuk mencegah kueri gagal. Query exhausted
resources at this scale factor Ini dapat diperbaiki dengan mencoba kembali kueri.
Jika kesalahan di atas tetap ada bahkan setelah mengoptimalkan kueri, Anda dapat mencatat kueri menggunakan peristiwa dan menjalankan kueri beberapa kali dalam interval yang lebih kecil dari rentang waktu kueri asli. eventTime