

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

# Optimalkan kueri CloudTrail Danau
<a name="lake-queries-optimization"></a>

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.

**Topics**
+ [Rekomendasi untuk mengoptimalkan kueri](#lake-queries-tuning)
+ [Solusi untuk kegagalan kueri](#lake-queries-troubleshooting)

## Rekomendasi untuk mengoptimalkan kueri
<a name="lake-queries-tuning"></a>

Ikuti rekomendasi di bagian ini untuk mengoptimalkan kueri Anda.

**Topics**
+ [Optimalkan agregasi](#query-optimization-aggregation)
+ [Gunakan teknik aproksimasi](#query-optimization-approximation)
+ [Batasi hasil kueri](#query-optimization-limit)
+ [Optimalkan kueri LIKE](#query-optimization-like)
+ [Gunakan `UNION ALL` sebagai pengganti `UNION`](#query-optimization-union)
+ [Sertakan hanya kolom yang diperlukan](#query-optimization-reqcolumns)
+ [Kurangi ruang lingkup fungsi jendela](#query-optimization-windows)

### Optimalkan agregasi
<a name="query-optimization-aggregation"></a>

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. `arbitrary`Fungsi 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` urutan`eventName`, dalam `GROUP BY` fungsi alih-alih`awsRegion`, `eventName` karena ada nilai yang lebih unik `eventName` daripada yang ada`awsRegion`.

```
SELECT eventName, awsRegion, count(*) 
FROM $EDS_ID 
GROUP BY eventName, awsRegion
```

### Gunakan teknik aproksimasi
<a name="query-optimization-approximation"></a>

Setiap kali nilai yang tepat tidak diperlukan untuk menghitung nilai yang berbeda, gunakan [fungsi agregat perkiraan](https://trino.io/docs/current/functions/aggregate.html#approximate-aggregate-functions) untuk menemukan nilai yang paling sering. Misalnya, [https://trino.io/docs/current/functions/aggregate.html#approx_distinct](https://trino.io/docs/current/functions/aggregate.html#approx_distinct)menggunakan memori jauh lebih sedikit dan berjalan lebih cepat daripada `COUNT(DISTINCT fieldName)` operasi.

### Batasi hasil kueri
<a name="query-optimization-limit"></a>

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
<a name="query-optimization-like"></a>

Anda dapat menggunakan `LIKE` untuk menemukan string yang cocok, tetapi dengan string panjang, ini adalah komputasi intensif. [https://trino.io/docs/current/functions/regexp.html#regexp_like](https://trino.io/docs/current/functions/regexp.html#regexp_like)Fungsi ini dalam banyak kasus merupakan alternatif yang lebih cepat.

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` sebagai pengganti `UNION`
<a name="query-optimization-union"></a>

`UNION ALL`dan `UNION` dua cara untuk menggabungkan hasil dari dua kueri menjadi satu hasil tetapi `UNION` menghapus duplikat. `UNION`perlu 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
<a name="query-optimization-reqcolumns"></a>

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 BY`Klausa 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
<a name="query-optimization-windows"></a>

[Fungsi jendela](https://trino.io/docs/current/functions/window.html) menyimpan semua catatan yang mereka operasikan dalam memori untuk menghitung hasilnya. Ketika jendela sangat besar, fungsi jendela bisa kehabisan memori. Untuk memastikan bahwa kueri berjalan dalam batas memori yang tersedia, kurangi ukuran jendela tempat fungsi jendela Anda beroperasi dengan menambahkan `PARTITION BY` klausa.

Terkadang kueri dengan fungsi jendela dapat ditulis ulang tanpa fungsi jendela. Misalnya, alih-alih menggunakan `row_number` atau`rank`, Anda dapat menggunakan fungsi agregat seperti [https://trino.io/docs/current/functions/aggregate.html#max_by](https://trino.io/docs/current/functions/aggregate.html#max_by)atau [https://trino.io/docs/current/functions/aggregate.html#min_by](https://trino.io/docs/current/functions/aggregate.html#min_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
<a name="lake-queries-troubleshooting"></a>

Bagian ini menyediakan solusi untuk kegagalan kueri umum.

**Topics**
+ [Kueri gagal karena responsnya terlalu besar](#large-responses)
+ [Kueri gagal karena kehabisan sumber daya](#exhausted-resources)

### Kueri gagal karena responsnya terlalu besar
<a name="large-responses"></a>

Kueri dapat gagal jika responsnya terlalu besar sehingga menghasilkan pesan`Query response is too large`. Jika ini terjadi, Anda dapat mengurangi ruang lingkup 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
<a name="exhausted-resources"></a>

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`