

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

# Kueri, fungsi, dan operator DML
<a name="dml-queries-functions-operators"></a>

Mesin kueri Athena DMLumumnya mendukung sintaks Trino dan Presto dan menambahkan peningkatannya sendiri. Athena tidak mendukung semua fitur Trino atau Presto. Untuk informasi selengkapnya, lihat topik untuk pernyataan khusus dalam bagian ini dan[Pertimbangan dan batasan](other-notable-limitations.md). Untuk informasi tentang fungsi, lihat[Fungsi di Amazon Athena](functions.md). Untuk informasi selengkapnya tentang versi mesin Aurora, lihat [Pembuatan versi mesin Athena](engine-versions.md). 

Untuk informasi tentang pernyataan DDL, lihat[Pernyataan DDL](ddl-reference.md). Untuk daftar pernyataan DDL yang tidak didukung, lihat. [DDL tidak didukung](unsupported-ddl.md)

**Topics**
+ [SELECT](select.md)
+ [INSERT INTO](insert-into.md)
+ [NILAI](values-statement.md)
+ [DELETE](delete-statement.md)
+ [UPDATE](update-statement.md)
+ [BERGABUNG MENJADI](merge-into-statement.md)
+ [MENGOPTIMALKAN](optimize-statement.md)
+ [VAKUM](vacuum-statement.md)
+ [JELASKAN dan JELASKAN ANALISIS](athena-explain-statement.md)
+ [MEMPERSIAPKAN](sql-prepare.md)
+ [MEMBONGKAR](unload.md)
+ [Fungsi](functions.md)
+ [Gunakan zona waktu yang didukung](athena-supported-time-zones.md)

# SELECT
<a name="select"></a>

Mengambil baris data dari nol atau lebih tabel.

**catatan**  
Topik ini menyediakan informasi ringkasan untuk referensi. Untuk informasi lengkap tentang penggunaan`SELECT`dan bahasa SQL berada di luar cakupan dokumentasi ini. Untuk informasi tentang menggunakan SQL yang khusus untuk Athena, lihat[Pertimbangan dan batasan untuk kueri SQL di Amazon Athena](other-notable-limitations.md)dan[Jalankan kueri SQL di Amazon Athena](querying-athena-tables.md). Untuk contoh membuat database, membuat tabel, dan menjalankan `SELECT` kueri pada tabel di Athena, lihat. [Memulai](getting-started.md)

## Sinopsis
<a name="synopsis"></a>

```
[ WITH with_query [, ...] ]
SELECT [ ALL | DISTINCT ] select_expression [, ...]
[ FROM from_item [, ...] ]
[ WHERE condition ]
[ GROUP BY [ ALL | DISTINCT ] grouping_element [, ...] ]
[ HAVING condition ]
[ { UNION | INTERSECT | EXCEPT } [ ALL | DISTINCT ] select ]
[ ORDER BY expression [ ASC | DESC ] [ NULLS FIRST | NULLS LAST] [, ...] ]
[ OFFSET count [ ROW | ROWS ] ]
[ LIMIT [ count | ALL ] ]
```

**catatan**  
kata Reserved dalam pernyataan SQL SELECT harus tertutup dalam tanda kutip ganda. Untuk informasi selengkapnya, lihat [Kata kunci yang dicadangkan untuk melarikan diri dalam pernyataan SQL SELECT](reserved-words.md#list-of-reserved-words-sql-select).

## Parameter
<a name="select-parameters"></a>

**[DENGAN with\$1query [,...]]**  
Anda dapat menggunakan`WITH`untuk meratakan kueri Nest, atau untuk menyederhanakan subqueries.  
Menggunakan `WITH` klausa untuk membuat kueri rekursif didukung mulai dari mesin Athena versi 3. Kedalaman rekursi maksimum adalah 10.  
Parameter`WITH`mendahului`SELECT`dalam kueri dan mendefinisikan satu atau lebih subqueries untuk digunakan dalam`SELECT`kueri.   
Setiap subquery mendefinisikan tabel sementara, mirip dengan definisi tampilan, yang dapat Anda referensi dalam`FROM`Klausul WHER Tabel yang digunakan hanya saat kueri berjalan.   
`with_query`Sintaks adalah:  

```
subquery_table_name [ ( column_name [, ...] ) ] AS (subquery)
```
Di mana:  
+  `subquery_table_name`adalah nama unik untuk tabel sementara yang mendefinisikan hasil`WITH`Klausul subkueri. Setiap`subquery`harus memiliki nama tabel yang dapat direferensikan dalam`FROM`Klausul WHER
+  `column_name [, ...]`adalah daftar opsional nama kolom output. Jumlah nama kolom harus sama dengan atau kurang dari jumlah kolom yang ditentukan oleh`subquery`.
+  `subquery`adalah pernyataan kueri.

**[SEMUA \$1 BERBEDA] select\$1expression**  
 `select_expression`menentukan baris yang akan dipilih. A `select_expression` dapat menggunakan salah satu format berikut:  

```
expression [ [ AS ] column_alias ] [, ...]
```

```
row_expression.* [ AS ( column_alias [, ...] ) ]
```

```
relation.*
```

```
*
```
+ `expression [ [ AS ] column_alias ]`Sintaks menentukan kolom output. `[AS] column_alias`Sintaks opsional menentukan nama heading kustom yang akan digunakan untuk kolom dalam output.
+ Untuk`row_expression.* [ AS ( column_alias [, ...] ) ]`, `row_expression` adalah ekspresi arbitrer dari tipe `ROW` data. Bidang baris menentukan kolom keluaran yang akan dimasukkan dalam hasil.
+ Untuk`relation.*`, kolom termasuk dalam hasil. `relation` Sintaks ini tidak mengizinkan penggunaan alias kolom.
+ Tanda bintang `*` menentukan bahwa semua kolom dimasukkan dalam set hasil.
+ Dalam kumpulan hasil, urutan kolom sama dengan urutan spesifikasinya dengan ekspresi pilih. Jika ekspresi pilih mengembalikan beberapa kolom, urutan kolom mengikuti urutan yang digunakan dalam relasi sumber atau ekspresi tipe baris.
+ Ketika alias kolom ditentukan, alias akan mengganti nama kolom atau kolom baris yang sudah ada sebelumnya. Jika ekspresi pilih tidak memiliki nama kolom, nama kolom anonim yang diindeks nol (`_col0`,`_col1`,`_col2, ...`) ditampilkan dalam output.
+  `ALL` sebagai default. Menggunakan`ALL`diperlakukan sama seperti jika dihilangkan; semua baris untuk semua kolom yang dipilih dan duplikat disimpan.
+ Gunakan`DISTINCT`untuk kembali nilai-nilai hanya berbeda saat kolom berisi nilai-nilai duplikat.

**DARI from\$1item [,...]**  
Menunjukkan masukan untuk kueri, dimana`from_item`bisa menjadi tampilan, bergabung membangun, atau subquery seperti yang dijelaskan di bawah ini.  
Parameter`from_item`dapat berupa:  
+  `table_name [ [ AS ] alias [ (column_alias [, ...]) ] ]` 

  Di mana`table_name`adalah nama dari tabel target untuk memilih baris,`alias`adalah nama untuk memberikan output dari`SELECT`pernyataan, dan`column_alias`mendefinisikan kolom untuk`alias`ditentukan.
 **-ATAU-**   
+  `join_type from_item [ ON join_condition | USING ( join_column [, ...] ) ]` 

  Di mana`join_type`adalah salah satu dari:
  +  `[ INNER ] JOIN` 
  +  `LEFT [ OUTER ] JOIN` 
  +  `RIGHT [ OUTER ] JOIN` 
  +  `FULL [ OUTER ] JOIN` 
  +  `CROSS JOIN` 
  +  `ON join_condition | USING (join_column [, ...])`Di mana menggunakan`join_condition`memungkinkan Anda untuk menentukan nama kolom untuk bergabung kunci dalam beberapa tabel, dan menggunakan`join_column`membutuhkan`join_column`ada di kedua tabel.

**[syarat WHERE]**  
Menyaring hasil sesuai dengan`condition`Anda tentukan, tempat`condition`umumnya memiliki sintaks berikut.  

```
column_name operator value [[[AND | OR] column_name operator value] ...]
```
Itu *operator* bisa menjadi salah satu pembanding`=`,,`>`,`<`,`>=`, `<=``<>`,`!=`.   
Ekspresi subquery berikut juga dapat digunakan dalam`WHERE`Klausul WHER  
+ `[NOT] BETWEEN integer_A AND integer_B`- Menentukan rentang antara dua bilangan bulat, seperti dalam contoh berikut. Jika tipe data kolom adalah`varchar`, kolom harus dilemparkan ke integer terlebih dahulu.

  ```
  SELECT DISTINCT processid FROM "webdata"."impressions"
  WHERE cast(processid as int) BETWEEN 1500 and 1800
  ORDER BY processid
  ```
+ `[NOT] LIKE value`— Pencarian untuk pola yang ditentukan. Gunakan tanda persen (`%`) sebagai karakter wildcard, seperti dalam contoh berikut.

  ```
  SELECT * FROM "webdata"."impressions"
  WHERE referrer LIKE '%.org'
  ```
+ `[NOT] IN (value[, value[, ...])`— Menentukan daftar nilai yang mungkin untuk kolom, seperti dalam contoh berikut.

  ```
  SELECT * FROM "webdata"."impressions"
  WHERE referrer IN ('example.com','example.net','example.org')
  ```

**[GROUP BY [SEMUA \$1 berbeda] grouping\$1expressions [,...]]**  
Membagi output dari`SELECT`pernyataan ke dalam baris dengan nilai-nilai yang cocok.  
 `ALL`dan`DISTINCT`menentukan apakah duplikat pengelompokan set masing-masing menghasilkan baris output yang berbeda. Jika dihilangkan,`ALL`diasumsikan.   
`grouping_expressions`memungkinkan Anda untuk melakukan operasi pengelompokan kompleks. Anda dapat menggunakan operasi pengelompokan kompleks untuk melakukan analisis yang memerlukan agregasi pada beberapa set kolom dalam satu kueri.  
Parameter`grouping_expressions`elemen dapat fungsi apapun, seperti`SUM`,`AVG`, atau`COUNT`, dilakukan pada kolom input.   
`GROUP BY`ekspresi dapat grup output dengan masukan nama kolom yang tidak muncul dalam output dari`SELECT`.   
Semua ekspresi output harus baik fungsi agregat atau kolom hadir dalam`GROUP BY`Klausul WHER   
Anda dapat menggunakan kueri tunggal untuk melakukan analisis yang membutuhkan menggabungkan beberapa set kolom.   
Athena mendukung agregasi kompleks menggunakan`GROUPING SETS`,`CUBE`dan`ROLLUP`.`GROUP BY GROUPING SETS`menentukan beberapa daftar kolom untuk grup pada.`GROUP BY CUBE`menghasilkan semua set pengelompokan mungkin untuk satu set tertentu kolom.`GROUP BY ROLLUP`menghasilkan semua subtotal mungkin untuk satu set tertentu kolom. Operasi pengelompokan kompleks tidak mendukung pengelompokan ekspresi terdiri dari kolom input. Hanya nama kolom yang diperbolehkan.   
Anda sering dapat menggunakan`UNION ALL`untuk mencapai hasil yang sama seperti ini`GROUP BY`, tetapi kueri yang menggunakan`GROUP BY`memiliki keuntungan membaca data satu kali, sedangkan`UNION ALL`membaca data yang mendasari tiga kali dan dapat menghasilkan hasil yang tidak konsisten saat sumber data dapat berubah. 

**[Memiliki syarat]**  
Digunakan dengan fungsi agregat dan`GROUP BY`Klausul WHER Mengontrol grup mana yang dipilih, menghilangkan grup yang tidak memuaskan`condition`. Penyaringan ini terjadi setelah grup dan agregat dihitung.

**[\$1UNION \$1 INTERSECT \$1 KECUL\$1 [SEMUA \$1 berbeda] union\$1query]]**  
`UNION`,`INTERSECT`, dan`EXCEPT`menggabungkan hasil lebih dari satu`SELECT`pernyataan ke dalam kueri tunggal.`ALL`atau`DISTINCT`mengontrol keunikan baris termasuk dalam set hasil akhir.   
`UNION`menggabungkan baris yang dihasilkan dari kueri pertama dengan baris yang dihasilkan dari kueri kedua. Untuk menghilangkan duplikat,`UNION`membangun sebuah tabel hash, yang mengkonsumsi memori. Untuk performa yang lebih baik, pertimbangkan menggunakan`UNION ALL`jika permintaan Anda tidak memerlukan penghapusan duplikat. Banyak`UNION`diproses kiri ke kanan kecuali Anda menggunakan tanda kurung untuk secara eksplisit menentukan urutan pemrosesan.  
`INTERSECT`kembali hanya baris yang hadir dalam hasil kedua pertama dan kedua kueri.  
`EXCEPT`mengembalikan baris dari hasil kueri pertama, tidak termasuk baris ditemukan oleh kueri kedua.  
`ALL`menyebabkan semua baris untuk dimasukkan, bahkan jika baris identik.  
`DISTINCT`menyebabkan baris hanya unik untuk dimasukkan dalam set hasil gabungan.

**[ORDER BY ekspresi [ASC \$1 DESC] [NULLS PERTAMA \$1 NULLS TERAKHIR] [,...]]**  
Mengurutkan hasil yang ditetapkan oleh satu atau lebih output`expression`.   
Saat klausa berisi beberapa ekspresi, hasil set diurutkan sesuai dengan yang pertama`expression`. Lalu yang kedua`expression`diterapkan ke baris yang memiliki nilai yang cocok dari ekspresi pertama, dan seterusnya.   
Setiap`expression`dapat menentukan kolom keluaran dari`SELECT`atau nomor urut untuk kolom output dengan posisi, mulai dari satu.  
`ORDER BY`dievaluasi sebagai langkah terakhir setelah`GROUP BY`atau`HAVING`Klausul WHER`ASC`dan`DESC`Menentukan apakah hasil diurutkan dalam urutan naik atau turun. Urutan penyortiran default adalah ascending (`ASC`). Default null pemesanan adalah`NULLS LAST`, terlepas dari urutan menaik atau menurun.

**[Hitungan OFFSET [BARIS \$1 BARIS]]**  
Gunakan `OFFSET` klausa untuk membuang sejumlah baris terdepan dari kumpulan hasil. Jika `ORDER BY` klausa ada, `OFFSET` klausa dievaluasi melalui kumpulan hasil yang diurutkan, dan himpunan tetap diurutkan setelah baris yang dilewati dibuang. Jika kueri tidak memiliki `ORDER BY` klausa, itu adalah arbitrer baris mana yang dibuang. Jika hitungan ditentukan `OFFSET` sama dengan atau melebihi ukuran set hasil, hasil akhirnya kosong. 

**LIMIT [menghitung \$1 SEMUA]**  
Membatasi jumlah baris dalam hasil diatur ke`count`.`LIMIT ALL`adalah sama dengan menghilangkan`LIMIT`Klausul WHER Jika kueri tidak memiliki`ORDER BY`klausul, hasilnya sewenang-wenang.

**Tablesample [BERNOULLI \$1 SISTEM] (persentase**  
Operator opsional untuk memilih baris dari tabel berdasarkan metode sampling.  
 `BERNOULLI`memilih setiap baris untuk berada dalam sampel tabel dengan probabilitas`percentage`. Semua blok fisik tabel dipindai, dan baris tertentu dilewati berdasarkan perbandingan antara sampel`percentage`dan nilai acak dihitung pada saat runtime.   
Dengan`SYSTEM`, tabel dibagi menjadi segmen logis data, dan tabel sampel di granularity ini.   
Entah semua baris dari segmen tertentu yang dipilih, atau segmen dilewati berdasarkan perbandingan antara sampel`percentage`dan nilai acak dihitung pada saat runtime.`SYSTEM`sampling tergantung pada konektor. Metode ini tidak menjamin probabilitas sampling independen.

**[UNNEST (array\$1or\$1map) [DENGAN ORDIALITAS]]**  
Memperluas larik atau peta ke dalam relasi. Larik diperluas menjadi satu kolom. Peta diperluas menjadi dua kolom (*kunci*,*nilai*).   
Anda dapat menggunakan`UNNEST`dengan beberapa argumen, yang diperluas menjadi beberapa kolom dengan banyak baris sebagai argumen kardinalitas tertinggi.   
kolom lainnya empuk dengan nulls.   
Parameter`WITH ORDINALITY`klausa menambahkan kolom ordinalitas sampai akhir.  
 `UNNEST`biasanya digunakan dengan`JOIN`dan dapat referensi kolom dari relasi di sisi kiri`JOIN`.

## Mendapatkan lokasi file untuk data sumber di Amazon S3
<a name="select-path"></a>

Untuk melihat lokasi file Amazon S3 untuk data dalam baris tabel, Anda dapat menggunakan`"$path"`dalam`SELECT`query, seperti dalam contoh berikut:

```
SELECT "$path" FROM "my_database"."my_table" WHERE year=2019;
```

Perintah ini akan menampilkan hasil berikut.

```
s3://amzn-s3-demo-bucket/datasets_mytable/year=2019/data_file1.json
```

Untuk kembali diurutkan, daftar unik dari jalur nama file S3 untuk data dalam tabel, Anda dapat menggunakan`SELECT DISTINCT`dan`ORDER BY`, seperti dalam contoh berikut.

```
SELECT DISTINCT "$path" AS data_source_file
FROM sampledb.elb_logs
ORDER By data_source_file ASC
```

Untuk mengembalikan hanya nama file tanpa path, Anda dapat melewati`"$path"`sebagai parameter untuk`regexp_extract`, seperti dalam contoh berikut.

```
SELECT DISTINCT regexp_extract("$path", '[^/]+$') AS data_source_file
FROM sampledb.elb_logs
ORDER By data_source_file ASC
```

Untuk mengembalikan data dari file tertentu, tentukan file di`WHERE`, seperti dalam contoh berikut.

```
SELECT *,"$path" FROM my_database.my_table WHERE "$path" = 's3://amzn-s3-demo-bucket/my_table/my_partition/file-01.csv'
```

Untuk informasi selengkapnya dan untuk contoh, lihat artikel Pusat Pengetahuan[Bagaimana saya bisa melihat file sumber Amazon S3 untuk baris dalam tabel Athena?](https://aws.amazon.com/premiumsupport/knowledge-center/find-s3-source-file-athena-table-row/).

**catatan**  
Di Athena, kolom metadata tersembunyi Hive atau Iceberg`$bucket`, `$file_modified_time``$file_size`, dan tidak didukung untuk tampilan. `$partition`

## Melarikan diri dari kutipan tunggal
<a name="select-escaping"></a>

 Untuk melarikan diri kutipan tunggal, mendahului dengan kutipan tunggal lain, seperti dalam contoh berikut. Jangan mengelirukan ini dengan sebut harga berganda. 

```
Select 'O''Reilly'
```

**Hasil**  
`O'Reilly`

## Sumber daya tambahan
<a name="select-additional-resources"></a>

Untuk informasi selengkapnya tentang penggunaan`SELECT`pernyataan di Athena, lihat sumber daya berikut.


| Untuk informasi tentang ini | Lihat ini | 
| --- | --- | 
| Menjalankan kueri di Athena | [Jalankan kueri SQL di Amazon Athena](querying-athena-tables.md) | 
| Untuk membuat tabel menggunakan SELECT API | [Buat tabel dari hasil kueri (CTAS)](ctas.md) | 
| Memasukkan data dariSELECTquery ke dalam tabel lain | [INSERT INTO](insert-into.md) | 
| Menggunakan fungsi bawaan diSELECTpernyataan | [Fungsi di Amazon Athena](functions.md) | 
| Menggunakan fungsi yang ditetapkan pengguna diSELECTpernyataan | [Kueri dengan fungsi yang ditentukan pengguna](querying-udf.md) | 
| Memkueri metadata Katalog Data | [Kueri AWS Glue Data Catalog](querying-glue-catalog.md) | 

# INSERT INTO
<a name="insert-into"></a>

Menyisipkan baris baru ke dalam tabel tujuan berdasarkan`SELECT`pernyataan permintaan yang berjalan pada tabel sumber, atau didasarkan pada satu set`VALUES`disediakan sebagai bagian dari pernyataan. Saat tabel sumber didasarkan pada data dasar dalam satu format, seperti CSV atau JSON, dan tabel tujuan didasarkan pada format lain, seperti Parquet atau ORC, Anda dapat menggunakan`INSERT INTO`query untuk mengubah data yang dipilih ke dalam format tabel tujuan. 

## Pertimbangan dan batasan
<a name="insert-into-limitations"></a>

Pertimbangkan hal berikut saat menggunakan`INSERT`Pertanyaan dengan Athena.
+ Saat menjalankan`INSERT`permintaan pada tabel dengan data dasar yang dienkripsi di Amazon S3, output file yang`INSERT`query menulis tidak dienkripsi secara default. Kami merekomendasikan bahwa Anda mengenkripsi`INSERT`permintaan hasil jika Anda memasukkan ke dalam tabel dengan data terenkripsi. 

  Untuk informasi selengkapnya tentang enkripsi hasil kueri menggunakan konsol, lihat[Enkripsi hasil kueri Athena yang disimpan di Amazon S3](encrypting-query-results-stored-in-s3.md). Untuk mengaktifkan enkripsi menggunakan AWS CLI atau Athena API, gunakan `EncryptionConfiguration` properti [StartQueryExecution](https://docs.aws.amazon.com/athena/latest/APIReference/API_StartQueryExecution.html)tindakan untuk menentukan opsi enkripsi Amazon S3 sesuai dengan kebutuhan Anda.
+ Untuk `INSERT INTO` pernyataan, setelan pemilik bucket yang diharapkan tidak berlaku untuk lokasi tabel tujuan di Amazon S3. Setelan pemilik bucket yang diharapkan hanya berlaku untuk lokasi keluaran Amazon S3 yang Anda tentukan untuk hasil kueri Athena. Untuk informasi selengkapnya, lihat [Tentukan lokasi hasil kueri menggunakan konsol Athena](query-results-specify-location-console.md).
+ Untuk `INSERT INTO` pernyataan yang sesuai dengan ACID, lihat `INSERT INTO` bagian. [Perbarui data tabel Gunung Es](querying-iceberg-updating-iceberg-table-data.md)

### Format yang didukung dan SerDes
<a name="insert-into-supported-formats"></a>

Anda dapat menjalankan `INSERT` kueri pada tabel yang dibuat dari data dengan format berikut dan SerDes.


| Format data | SerDe | 
| --- | --- | 
|  Avro  |  org.apache.hadoop.hive.serde2.avro. AvroSerDe  | 
| Ion | com.amazon.ionhiveserde. IonHiveSerDe | 
|  JSON  |  org.apache.hive.hcatalog.data. JsonSerDe  | 
|  ORC  |  org.apache.hadoop.hive.ql.io.orc. OrcSerde  | 
|  Parquet  |  org.apache.hadoop.hive.ql.io.parquet.serde. ParquetHiveSerDe  | 
|  File teks  |  org.apache.hadoop.hive.serde2.lazy. LazySimpleSerDe  TSV dan file yang dibatasi khusus didukung.   | 
| CSV | org.apache.hadoop.hive.serde2.open CSVSerde Menulis hanya didukung untuk tipe string. Dari Athena, Anda tidak dapat menulis ke tabel apa pun yang berisi jenis non-string dalam skema Glue. Untuk informasi lebih lanjut, lihat [CSV SerDe](csv-serde.md#csv-serde-opencsvserde-considerations-non-string).  | 

### Tabel bucketed tidak didukung
<a name="insert-into-bucketed-tables-not-supported"></a>

`INSERT INTO`tidak didukung pada tabel bucketed. Untuk informasi selengkapnya, lihat [Gunakan partisi dan bucketing](ctas-partitioning-and-bucketing.md).

### Kueri federasi tidak didukung
<a name="insert-into-federated-queries-not-supported"></a>

`INSERT INTO`tidak didukung untuk kueri federasi. Mencoba melakukannya dapat mengakibatkan pesan kesalahan Operasi ini saat ini tidak didukung untuk katalog eksternal. Untuk informasi tentang kueri federasi, lihat. [Gunakan Kueri Federasi Amazon Athena](federated-queries.md)

### Partitioning
<a name="insert-into-limitations-partitioning"></a>

Pertimbangkan poin di bagian ini saat menggunakan partisi dengan `INSERT INTO` atau `CREATE TABLE AS SELECT` kueri.

#### Batas
<a name="insert-into-partition-limits"></a>

Parameter`INSERT INTO`mendukung menulis maksimal 100 partisi ke tabel tujuan. Jika Anda menjalankan`SELECT`klausul di atas tabel dengan lebih dari 100 partisi, permintaan gagal kecuali`SELECT`permintaan terbatas untuk 100 partisi atau lebih sedikit.

Untuk informasi tentang cara mengatasi batasan ini, lihat[Gunakan CTAS dan INSERT INTO untuk bekerja di sekitar batas partisi 100](ctas-insert-into.md).

#### Pemesanan kolom
<a name="insert-into-partition-detection"></a>

`INSERT INTO`atau`CREATE TABLE AS SELECT`berharap kolom dipartisi menjadi kolom terakhir dalam daftar kolom diproyeksikan dalam`SELECT`. 

Jika tabel sumber non-dipartisi, atau dipartisi pada kolom yang berbeda dibandingkan dengan tabel tujuan, kueri seperti`INSERT INTO destination_table SELECT * FROM source_table`mempertimbangkan nilai-nilai di kolom terakhir dari tabel sumber menjadi nilai untuk kolom partisi dalam tabel tujuan. Ingatlah hal ini saat mencoba membuat tabel dipartisi dari tabel non-dipartisi.

#### Sumber daya
<a name="insert-into-partition-resources"></a>

Untuk informasi selengkapnya tentang penggunaan`INSERT INTO`dengan partisi, lihat sumber daya berikut.
+ Untuk memasukkan data dipartisi ke dalam tabel dipartisi, lihat[Gunakan CTAS dan INSERT INTO untuk bekerja di sekitar batas partisi 100](ctas-insert-into.md).
+ Untuk memasukkan data unpartitioned ke dalam tabel dipartisi, lihat[Gunakan CTAS dan INSERT INTO untuk ETL dan analisis data](ctas-insert-into-etl.md). 

### File yang ditulis ke Amazon S3
<a name="insert-into-files-written-to-s3"></a>

Athena menulis file ke lokasi sumber data di Amazon S3 sebagai hasil dari`INSERT`Perintah. Setiap`INSERT`operasi menciptakan file baru, daripada menambahkan ke file yang ada. Lokasi file tergantung pada struktur tabel dan`SELECT`query, jika ada. Athena menghasilkan file manifest data untuk setiap`INSERT`kueri. Manifest melacak file yang kueri menulis. Ini disimpan ke lokasi hasil kueri Athena di Amazon S3. Untuk informasi selengkapnya, lihat [Identifikasi file keluaran kueri](querying-finding-output-files.md#querying-identifying-output-files).

### Hindari pembaruan yang sangat transaksional
<a name="insert-into-transactional-caveat"></a>

Saat Anda menggunakan `INSERT INTO` untuk menambahkan baris ke tabel di Amazon S3, Athena tidak menulis ulang atau memodifikasi file yang ada. Sebaliknya, ia menulis baris sebagai satu atau lebih file baru. Karena tabel dengan [banyak file kecil menghasilkan kinerja kueri yang lebih rendah](performance-tuning-data-optimization-techniques.md#performance-tuning-avoid-having-too-many-files), dan operasi tulis dan baca seperti `PutObject` dan `GetObject` menghasilkan biaya yang lebih tinggi dari Amazon S3, pertimbangkan opsi berikut saat menggunakan: `INSERT INTO`
+ Jalankan `INSERT INTO` operasi lebih jarang pada batch baris yang lebih besar.
+ Untuk volume konsumsi data yang besar, pertimbangkan untuk menggunakan layanan seperti [Amazon Data Firehose](https://docs.aws.amazon.com/firehose/latest/dev/what-is-this-service.html).
+ Hindari menggunakan `INSERT INTO` sama sekali. Sebagai gantinya, kumpulkan baris menjadi file yang lebih besar dan unggah langsung ke Amazon S3 di mana mereka dapat ditanyakan oleh Athena.

### Menemukan file yatim piatu
<a name="insert-into-files-partial-data"></a>

Jika `INSERT INTO` pernyataan `CTAS` atau gagal, data yatim piatu dapat ditinggalkan di lokasi data dan dapat dibaca dalam kueri berikutnya. Untuk menemukan file yatim piatu untuk pemeriksaan atau penghapusan, Anda dapat menggunakan file manifest data yang disediakan Athena untuk melacak daftar file yang akan ditulis. Untuk informasi selengkapnya, lihat [Identifikasi file keluaran kueri](querying-finding-output-files.md#querying-identifying-output-files) dan [DataManifestLocation](https://docs.aws.amazon.com/athena/latest/APIReference/API_QueryExecutionStatistics.html#athena-Type-QueryExecutionStatistics-DataManifestLocation).

## MASUKKAN KE... PILIH
<a name="insert-into-select"></a>

Menentukan kueri untuk berjalan di satu tabel,`source_table`, yang menentukan baris untuk dimasukkan ke dalam tabel kedua,`destination_table`. Jika`SELECT`query menentukan kolom dalam`source_table`, kolom harus tepat sesuai dengan yang ada di`destination_table`.

Untuk informasi selengkapnya tentang kueri `SELECT` ini, lihat [SELECT](select.md).

### Sinopsis
<a name="insert-into-select-synopsis"></a>

```
INSERT INTO destination_table 
SELECT select_query 
FROM source_table_or_view
```

### Contoh
<a name="insert-into-select-examples"></a>

Pilih semua baris di`vancouver_pageviews`tabel dan memasukkan mereka ke dalam`canada_pageviews`Tabel:

```
INSERT INTO canada_pageviews 
SELECT * 
FROM vancouver_pageviews;
```

Pilih hanya baris tersebut di`vancouver_pageviews`Tabel tempat`date`kolom memiliki nilai antara`2019-07-01`dan`2019-07-31`, dan kemudian masukkan ke dalam`canada_july_pageviews`:

```
INSERT INTO canada_july_pageviews
SELECT *
FROM vancouver_pageviews
WHERE date
    BETWEEN date '2019-07-01'
        AND '2019-07-31';
```

Pilih nilai dalam`city`dan`state`kolom di`cities_world`tabel hanya dari baris dengan nilai`usa`di`country`kolom dan memasukkan mereka ke`city`dan`state`kolom di`cities_usa`Tabel:

```
INSERT INTO cities_usa (city,state)
SELECT city,state
FROM cities_world
    WHERE country='usa'
```

## MASUKKAN KEDALAM... NILAI
<a name="insert-into-values"></a>

Menyisipkan baris ke dalam tabel yang ada dengan menentukan kolom dan nilai-nilai. kolom yang ditentukan dan tipe data yang terkait harus tepat sesuai dengan kolom dan tipe data dalam tabel tujuan.

**penting**  
Kami tidak menyarankan untuk memasukkan baris menggunakan`VALUES`karena Athena menghasilkan file untuk setiap`INSERT`operasi. Ini dapat menyebabkan banyak file kecil yang akan dibuat dan menurunkan performa permintaan tabel. Untuk mengidentifikasi file yang`INSERT`query menciptakan, memeriksa file manifest data. Untuk informasi selengkapnya, lihat [Bekerja dengan hasil kueri dan kueri terbaru](querying.md).

### Sinopsis
<a name="insert-into-values-synopsis"></a>

```
INSERT INTO destination_table [(col1,col2,...)] 
VALUES (col1value,col2value,...)[,
       (col1value,col2value,...)][,
       ...]
```

### Contoh
<a name="insert-into-values-examples"></a>

Dalam contoh berikut, tabel kota memiliki tiga kolom:`id`,`city`,`state`,`state_motto`. Parameter`id`Kolom adalah tipe`INT`dan semua lajur lain adalah jenis`VARCHAR`.

Sisipkan satu baris ke dalam`cities`tabel, dengan semua nilai kolom yang ditentukan:

```
INSERT INTO cities 
VALUES (1,'Lansing','MI','Si quaeris peninsulam amoenam circumspice')
```

Masukkan dua baris ke dalam`cities`Tabel:

```
INSERT INTO cities 
VALUES (1,'Lansing','MI','Si quaeris peninsulam amoenam circumspice'),
       (3,'Boise','ID','Esto perpetua')
```

# NILAI
<a name="values-statement"></a>

Membuat tabel inline literal. Tabel bisa anonim, atau Anda dapat menggunakan `AS` klausa untuk menentukan nama tabel, nama kolom, atau keduanya.

## Sinopsis
<a name="values-statement-synopsis"></a>

```
VALUES row [, ...]
```

## Parameter
<a name="values-statement-parameters"></a>

**mendayung**  
`row`Parameter dapat berupa ekspresi tunggal atau`( column_expression [, ...] )`.

## Contoh
<a name="values-statement-examples"></a>

Kembalikan tabel dengan satu kolom dan tiga baris:

```
VALUES 1, 2, 3
```

Kembalikan tabel dengan dua kolom dan tiga baris:

```
VALUES
    (1, 'a'),
    (2, 'b'),
    (3, 'c')
```

Kembalikan tabel dengan kolom `id` dan`name`:

```
SELECT * FROM (
    VALUES
        (1, 'a'),
        (2, 'b'),
        (3, 'c')
) AS t (id, name)
```

Buat tabel yang disebut `customers` dengan kolom `id` dan`name`:

```
CREATE TABLE customers AS
SELECT * FROM (
    VALUES
        (1, 'a'),
        (2, 'b'),
        (3, 'c')
) AS t (id, name)
```

## Lihat juga
<a name="values-statement-see-also"></a>

[MASUKKAN KEDALAM... NILAI](insert-into.md#insert-into-values)

# DELETE
<a name="delete-statement"></a>

Menghapus baris dalam tabel Apache Iceberg. `DELETE`bersifat transaksional dan hanya didukung untuk tabel Apache Iceberg.

## Sinopsis
<a name="delete-statement-synopsis"></a>

Untuk menghapus baris dari tabel Iceberg, gunakan sintaks berikut.

```
DELETE FROM [db_name.]table_name [WHERE predicate]
```

Untuk informasi dan contoh selengkapnya, lihat `DELETE` bagian[Perbarui data tabel Gunung Es](querying-iceberg-updating-iceberg-table-data.md).

# UPDATE
<a name="update-statement"></a>

Memperbarui baris dalam tabel Apache Iceberg. `UPDATE`bersifat transaksional dan hanya didukung untuk tabel Apache Iceberg. Pernyataan ini hanya berfungsi pada baris yang ada dan tidak dapat digunakan untuk menyisipkan atau menambahkan baris.

## Sinopsis
<a name="update-statement-synopsis"></a>

Untuk memperbarui baris dalam tabel Iceberg, gunakan sintaks berikut.

```
UPDATE [db_name.]table_name SET xx=yy[,...] [WHERE predicate]
```

Untuk informasi dan contoh selengkapnya, lihat `UPDATE` bagian[Perbarui data tabel Gunung Es](querying-iceberg-updating-iceberg-table-data.md).

# BERGABUNG MENJADI
<a name="merge-into-statement"></a>

Secara kondisional memperbarui, menghapus, atau menyisipkan baris ke dalam tabel Apache Iceberg. Sebuah pernyataan tunggal dapat menggabungkan tindakan pembaruan, menghapus, dan menyisipkan.

**catatan**  
`MERGE INTO`bersifat transaksional dan hanya didukung untuk tabel Apache Iceberg di mesin Athena versi 3.

## Sinopsis
<a name="merge-into-statement-synopsis"></a>

Untuk memperbarui, menghapus, atau menyisipkan baris secara kondisional dari tabel Iceberg, gunakan sintaks berikut.

```
MERGE INTO target_table [ [ AS ]  target_alias ]
USING { source_table | query } [ [ AS ] source_alias ]
ON search_condition
when_clause [...]
```

*when\$1clause*Ini adalah salah satu dari berikut ini:

```
WHEN MATCHED [ AND condition ]
    THEN DELETE
```

```
WHEN MATCHED [ AND condition ]
    THEN UPDATE SET ( column = expression [, ...] )
```

```
WHEN NOT MATCHED [ AND condition ]
    THEN INSERT (column_name[, column_name ...]) VALUES (expression, ...)
```

`MERGE`mendukung sejumlah `WHEN` klausa yang sewenang-wenang dengan kondisi yang berbeda. `MATCHED` Klausa kondisi mengeksekusi`DELETE`, `UPDATE` atau `INSERT` operasi dalam `WHEN` klausa pertama yang dipilih oleh `MATCHED` status dan kondisi kecocokan.

Untuk setiap baris sumber, `WHEN` klausa diproses secara berurutan. Hanya `WHEN` klausa pencocokan pertama yang dieksekusi. Klausul selanjutnya diabaikan. Kesalahan pengguna muncul ketika satu baris tabel target cocok dengan lebih dari satu baris sumber.

Jika baris sumber tidak cocok dengan `WHEN` klausa apa pun dan tidak ada `WHEN NOT MATCHED` klausa, baris sumber diabaikan.

Dalam `WHEN` klausa yang memiliki `UPDATE` operasi, ekspresi nilai kolom dapat merujuk ke bidang apa pun dari target atau sumber. Dalam `NOT MATCHED` kasus ini, `INSERT` ekspresi dapat merujuk ke bidang sumber apa pun.

**Contoh**  
Contoh berikut menggabungkan baris dari tabel kedua ke tabel pertama jika baris tidak ada di tabel pertama. Perhatikan bahwa kolom yang tercantum dalam `VALUES` klausa harus diawali dengan alias tabel sumber. Kolom target yang tercantum dalam `INSERT` klausa *tidak* boleh diawali.

```
MERGE INTO iceberg_table_sample as ice1
USING iceberg2_table_sample as ice2
ON ice1.col1 = ice2.col1
WHEN NOT MATCHED 
THEN INSERT (col1)
      VALUES (ice2.col1)
```

Untuk `MERGE INTO` contoh lainnya, lihat[Perbarui data tabel Gunung Es](querying-iceberg-updating-iceberg-table-data.md).

# MENGOPTIMALKAN
<a name="optimize-statement"></a>

Mengoptimalkan baris dalam tabel Apache Iceberg dengan menulis ulang file data ke dalam tata letak yang lebih dioptimalkan berdasarkan ukuran dan jumlah file penghapusan terkait.

**catatan**  
`OPTIMIZE`bersifat transaksional dan hanya didukung untuk tabel Apache Iceberg.

## Sintaksis
<a name="optimize-statement-syntax"></a>

Ringkasan sintaks berikut menunjukkan cara mengoptimalkan tata letak data untuk tabel Iceberg.

```
OPTIMIZE [db_name.]table_name REWRITE DATA USING BIN_PACK
  [WHERE predicate]
```

**catatan**  
Hanya kolom partisi yang diizinkan dalam `WHERE` klausa*predicate*. Menentukan kolom non-partisi akan menyebabkan query gagal. 

Tindakan pemadatan dibebankan oleh jumlah data yang dipindai selama proses penulisan ulang. `REWRITE DATA`Tindakan ini menggunakan predikat untuk memilih file yang berisi baris yang cocok. Jika ada baris dalam file yang cocok dengan predikat, file dipilih untuk pengoptimalan. Dengan demikian, untuk mengontrol jumlah file yang terpengaruh oleh operasi pemadatan, Anda dapat menentukan `WHERE` klausa.

## Mengkonfigurasi properti pemadatan
<a name="optimize-statement-configuring-compaction-properties"></a>

Untuk mengontrol ukuran file yang akan dipilih untuk pemadatan dan ukuran file yang dihasilkan setelah pemadatan, Anda dapat menggunakan parameter properti tabel. Anda dapat menggunakan [MENGUBAH TABEL SET TBLPROPERTIES](querying-iceberg-alter-table-set-properties.md) perintah untuk mengkonfigurasi [properti tabel](querying-iceberg-creating-tables.md#querying-iceberg-table-properties) terkait.

## Sumber daya tambahan
<a name="optimize-statement-additional-resources"></a>

[Optimalkan tabel Iceberg](querying-iceberg-data-optimization.md)

# VAKUM
<a name="vacuum-statement"></a>

`VACUUM`[Pernyataan tersebut melakukan pemeliharaan tabel pada tabel Apache Iceberg dengan melakukan [kedaluwarsa snapshot dan penghapusan file yatim piatu](https://iceberg.apache.org/docs/latest/spark-procedures/#expire_snapshots).](https://iceberg.apache.org/docs/latest/spark-procedures/#remove_orphan_files)

**catatan**  
`VACUUM`bersifat transaksional dan hanya didukung untuk tabel Apache Iceberg di mesin Athena versi 3.

`VACUUM`Pernyataan tersebut mengoptimalkan tabel Iceberg dengan mengurangi konsumsi penyimpanan. Untuk informasi selengkapnya tentang penggunaan `VACUUM`, lihat [Optimalkan tabel Iceberg](querying-iceberg-data-optimization.md). Perhatikan bahwa, karena `VACUUM` pernyataan tersebut membuat panggilan API ke Amazon S3, biaya berlaku untuk permintaan terkait ke Amazon S3.

**Awas**  
Jika Anda menjalankan operasi kedaluwarsa snapshot, Anda tidak dapat lagi melakukan perjalanan waktu ke snapshot yang kedaluwarsa.

## Sinopsis
<a name="vacuum-statement-synopsis"></a>

Untuk menghapus file data yang tidak lagi diperlukan untuk tabel Iceberg, gunakan sintaks berikut.

```
VACUUM [database_name.]target_table
```
+ `VACUUM`mengharapkan data Iceberg berada di folder Amazon S3 daripada ember Amazon S3. Misalnya, jika data Iceberg Anda di`s3://amzn-s3-demo-bucket`/bukan`s3://amzn-s3-demo-bucket/myicebergfolder/`, `VACUUM` pernyataan gagal dengan pesan kesalahan GENERIC\$1INTERNAL\$1ERROR: Jalur hilang di lokasi sistem file:. `s3://amzn-s3-demo-bucket`
+ `VACUUM`Agar dapat menghapus file data, peran eksekusi kueri Anda harus memiliki `s3:DeleteObject` izin di bucket tempat tabel Iceberg, metadata, snapshot, dan file data berada. Jika izin tidak ada, `VACUUM` kueri akan berhasil, tetapi file tidak akan dihapus. 
+ Untuk berjalan `VACUUM` di atas meja dengan nama yang dimulai dengan garis bawah (misalnya,`_mytable`), lampirkan nama tabel di backticks, seperti pada contoh berikut. Jika Anda mengawali nama tabel dengan nama database, jangan lampirkan nama database di backticks. Perhatikan bahwa tanda kutip ganda tidak akan berfungsi sebagai pengganti backticks. 

  Perilaku ini khusus untuk`VACUUM`. `INSERT INTO`Pernyataan `CREATE` dan tidak memerlukan backticks untuk nama tabel yang dimulai dengan garis bawah.

  ```
  VACUUM `_mytable`
  VACUUM my_database.`_mytable`
  ```

## Operasi dilakukan
<a name="vacuum-statement-operations-performed"></a>

`VACUUM`melakukan operasi berikut:
+ Menghapus snapshot yang lebih tua dari jumlah waktu yang ditentukan oleh properti `vacuum_max_snapshot_age_seconds` tabel. Secara default, properti ini diatur ke 432000 detik (5 hari).
+ Menghapus snapshot yang tidak berada dalam periode yang akan dipertahankan yang melebihi jumlah yang ditentukan oleh properti `vacuum_min_snapshots_to_keep` tabel. Default-nya adalah 1.

  Anda dapat menentukan properti tabel ini dalam `CREATE TABLE` pernyataan Anda. Setelah tabel dibuat, Anda dapat menggunakan [MENGUBAH TABEL SET TBLPROPERTIES](querying-iceberg-alter-table-set-properties.md) pernyataan untuk memperbaruinya. 
+ Menghapus semua metadata dan file data yang tidak dapat dijangkau sebagai akibat dari penghapusan snapshot. Anda dapat mengonfigurasi jumlah file metadata lama yang akan dipertahankan dengan menyetel properti tabel. `vacuum_max_metadata_files_to_keep` Nilai default-nya adalah 100.
+ Menghapus file yatim piatu yang lebih tua dari waktu yang ditentukan dalam properti `vacuum_max_snapshot_age_seconds` tabel. File yatim piatu adalah file dalam direktori data tabel yang bukan bagian dari status tabel.

Untuk informasi lebih lanjut tentang membuat dan mengelola tabel Apache Iceberg di Athena, lihat dan. [Buat tabel Iceberg](querying-iceberg-creating-tables.md) [Mengelola tabel Iceberg](querying-iceberg-managing-tables.md)

# Menggunakan EXPLAIN dan EXPLAIN ANALYZE di Athena
<a name="athena-explain-statement"></a>

Parameter`EXPLAIN`pernyataan menunjukkan rencana eksekusi logis atau didistribusikan dari pernyataan SQL tertentu, atau memvalidasi pernyataan SQL. Anda dapat menampilkan hasil dalam format teks atau dalam format data untuk rendering ke grafik.

**catatan**  
Anda dapat melihat representasi grafis dari rencana logis dan terdistribusi untuk kueri Anda di konsol Athena tanpa menggunakan sintaks. `EXPLAIN` Untuk informasi selengkapnya, lihat [Lihat rencana eksekusi untuk kueri SQL](query-plans.md).

`EXPLAIN ANALYZE`Pernyataan tersebut menunjukkan rencana eksekusi terdistribusi dari pernyataan SQL tertentu dan biaya komputasi setiap operasi dalam kueri SQL. Anda dapat menampilkan hasil dalam format teks atau JSON. 

## Pertimbangan dan batasan
<a name="athena-explain-statement-considerations-and-limitations"></a>

`EXPLAIN ANALYZE`Pernyataan `EXPLAIN` dan di Athena memiliki batasan sebagai berikut.
+ Karena`EXPLAIN`pertanyaan tidak memindai data apapun, Athena tidak mengenakan biaya untuk mereka. Namun, karena `EXPLAIN` kueri melakukan panggilan AWS Glue untuk mengambil metadata tabel, Anda mungkin dikenakan biaya dari Glue jika panggilan melebihi batas tingkat [gratis untuk](https://aws.amazon.com/free/?all-free-tier.sort-by=item.additionalFields.SortRank&all-free-tier.sort-order=asc&awsf.Free%20Tier%20Categories=categories%23analytics&all-free-tier.q=glue&all-free-tier.q_operator=AND) lem.
+ Karena `EXPLAIN ANALYZE` kueri dijalankan, mereka memindai data, dan Athena mengenakan biaya untuk jumlah data yang dipindai.
+ Informasi pemfilteran baris atau sel yang ditentukan dalam Lake Formation dan informasi statistik kueri tidak ditampilkan dalam output dan. `EXPLAIN` `EXPLAIN ANALYZE`

## JELASKAN sintaks
<a name="athena-explain-statement-syntax-athena-engine-version-2"></a>

```
EXPLAIN [ ( option [, ...]) ] statement
```

*option* dapat berupa salah satu status berikut:

```
FORMAT { TEXT | GRAPHVIZ | JSON }
TYPE { LOGICAL | DISTRIBUTED | VALIDATE | IO }
```

Jika `FORMAT` opsi tidak ditentukan, output default ke format. `TEXT` `IO`Jenis ini memberikan informasi tentang tabel dan skema yang dibaca kueri. 

## JELASKAN ANALYSIS sintaks
<a name="athena-explain-analyze-statement"></a>

Selain output yang disertakan`EXPLAIN`, `EXPLAIN ANALYZE` output juga mencakup statistik runtime untuk kueri yang ditentukan seperti penggunaan CPU, jumlah baris input, dan jumlah baris output.

```
EXPLAIN ANALYZE [ ( option [, ...]) ] statement
```

*option* dapat berupa salah satu status berikut:

```
FORMAT { TEXT | JSON }
```

Jika `FORMAT` opsi tidak ditentukan, output default ke format. `TEXT` Karena semua kueri untuk `EXPLAIN ANALYZE` adalah`DISTRIBUTED`, `TYPE` opsi tidak tersedia untuk`EXPLAIN ANALYZE`. 

*statement* dapat berupa salah satu status berikut:

```
SELECT
CREATE TABLE AS SELECT
INSERT
UNLOAD
```

## JELASKAN contoh
<a name="athena-explain-statement-examples"></a>

Contoh berikut untuk `EXPLAIN` kemajuan dari yang lebih mudah ke yang lebih kompleks.

### Contoh 1: Gunakan pernyataan EXPLOW untuk menampilkan rencana kueri dalam format teks
<a name="athena-explain-statement-example-text-query-plan"></a>

Dalam contoh berikut, `EXPLAIN` menunjukkan rencana eksekusi untuk `SELECT` kueri pada log Elastic Load Balancing. Format default ke output teks.

```
EXPLAIN 
SELECT 
   request_timestamp, 
   elb_name, 
   request_ip 
FROM sampledb.elb_logs;
```

#### Hasil
<a name="athena-explain-statement-example-text-query-plan-results"></a>

```
- Output[request_timestamp, elb_name, request_ip] => [[request_timestamp, elb_name, request_ip]]
    - RemoteExchange[GATHER] => [[request_timestamp, elb_name, request_ip]]
        - TableScan[awsdatacatalog:HiveTableHandle{schemaName=sampledb, tableName=elb_logs, 
analyzePartitionValues=Optional.empty}] => [[request_timestamp, elb_name, request_ip]]
                LAYOUT: sampledb.elb_logs
                request_ip := request_ip:string:2:REGULAR
                request_timestamp := request_timestamp:string:0:REGULAR
                elb_name := elb_name:string:1:REGULAR
```

### Contoh 2: Gunakan EXPLOW untuk membuat grafik rencana kueri
<a name="athena-explain-statement-example-graph-a-query-plan"></a>

Anda dapat menggunakan konsol Athena untuk membuat grafik rencana kueri untuk Anda. **Masukkan `SELECT` pernyataan seperti berikut ini ke dalam editor kueri Athena, lalu pilih JELASKAN.**

```
SELECT 
      c.c_custkey,
      o.o_orderkey,
      o.o_orderstatus
   FROM tpch100.customer c 
   JOIN tpch100.orders o 
       ON c.c_custkey = o.o_custkey
```

Halaman **Jelaskan** editor kueri Athena terbuka dan menunjukkan kepada Anda rencana terdistribusi dan rencana logis untuk kueri tersebut. Grafik berikut menunjukkan rencana logis untuk contoh.

![\[Grafik rencana kueri yang diberikan oleh editor kueri Athena.\]](http://docs.aws.amazon.com/id_id/athena/latest/ug/images/athena-explain-statement-tpch.png)


**penting**  
Saat ini, beberapa filter partisi mungkin tidak terlihat di grafik pohon operator bersarang meskipun Athena menerapkannya ke kueri Anda. Untuk memverifikasi efek filter tersebut, jalankan `EXPLAIN` atau `EXPLAIN ANALYZE` pada kueri Anda dan lihat hasilnya.

Untuk informasi selengkapnya tentang menggunakan fitur grafik paket kueri di konsol Athena, lihat. [Lihat rencana eksekusi untuk kueri SQL](query-plans.md)

### Contoh 3: Gunakan pernyataan EXPLOW untuk memverifikasi pemangkasan partisi
<a name="athena-explain-statement-example-verify-partition-pruning"></a>

Saat Anda menggunakan predikat penyaringan pada bukti kunci dipartisi untuk kueri tabel dipartisi, mesin permintaan berlaku predikat untuk bukti kunci dipartisi untuk mengurangi jumlah data yang dibaca.

Contoh berikut menggunakan`EXPLAIN`query untuk memverifikasi partisi pemangkasan untuk`SELECT`query pada tabel dipartisi. Pertama,`CREATE TABLE`pernyataan menciptakan`tpch100.orders_partitioned`tabel. Tabel dipartisi pada kolom`o_orderdate`.

```
CREATE TABLE `tpch100.orders_partitioned`(
  `o_orderkey` int, 
  `o_custkey` int, 
  `o_orderstatus` string, 
  `o_totalprice` double, 
  `o_orderpriority` string, 
  `o_clerk` string, 
  `o_shippriority` int, 
  `o_comment` string)
PARTITIONED BY ( 
  `o_orderdate` string)
ROW FORMAT SERDE 
  'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
LOCATION
  's3://amzn-s3-demo-bucket/<your_directory_path>/'
```

Parameter`tpch100.orders_partitioned`tabel memiliki beberapa partisi pada`o_orderdate`, seperti yang ditunjukkan oleh`SHOW PARTITIONS`Perintah.

```
SHOW PARTITIONS tpch100.orders_partitioned;

o_orderdate=1994
o_orderdate=2015
o_orderdate=1998
o_orderdate=1995
o_orderdate=1993
o_orderdate=1997
o_orderdate=1992
o_orderdate=1996
```

Berikut`EXPLAIN`query memverifikasi partisi pemangkasan pada ditentukan`SELECT`.

```
EXPLAIN 
SELECT 
   o_orderkey, 
   o_custkey, 
   o_orderdate 
FROM tpch100.orders_partitioned
WHERE o_orderdate = '1995'
```

#### Hasil
<a name="athena-explain-statement-example-verify-partition-pruning-results"></a>

```
Query Plan
- Output[o_orderkey, o_custkey, o_orderdate] => [[o_orderkey, o_custkey, o_orderdate]]
    - RemoteExchange[GATHER] => [[o_orderkey, o_custkey, o_orderdate]]
        - TableScan[awsdatacatalog:HiveTableHandle{schemaName=tpch100, tableName=orders_partitioned, 
analyzePartitionValues=Optional.empty}] => [[o_orderkey, o_custkey, o_orderdate]]
                LAYOUT: tpch100.orders_partitioned
                o_orderdate := o_orderdate:string:-1:PARTITION_KEY
                    :: [[1995]]
                o_custkey := o_custkey:int:1:REGULAR
                o_orderkey := o_orderkey:int:0:REGULAR
```

Teks tebal dalam hasil menunjukkan bahwa predikat`o_orderdate = '1995'`diterapkan pada`PARTITION_KEY`.

### Contoh 4: Gunakan kueri EXPLOW untuk memeriksa jenis join order dan join
<a name="athena-explain-statement-example-check-join-order-and-type"></a>

Berikut`EXPLAIN`memeriksa kueri`SELECT`perintah bergabung pernyataan dan bergabung jenis. Gunakan kueri seperti ini untuk memeriksa penggunaan memori kueri sehingga Anda dapat mengurangi kemungkinan mendapatkan`EXCEEDED_LOCAL_MEMORY_LIMIT`kesalahan.

```
EXPLAIN (TYPE DISTRIBUTED)
   SELECT 
      c.c_custkey, 
      o.o_orderkey,
      o.o_orderstatus
   FROM tpch100.customer c 
   JOIN tpch100.orders o 
       ON c.c_custkey = o.o_custkey 
   WHERE c.c_custkey = 123
```

#### Hasil
<a name="athena-explain-statement-example-check-join-order-and-type-results"></a>

```
Query Plan
Fragment 0 [SINGLE]
    Output layout: [c_custkey, o_orderkey, o_orderstatus]
    Output partitioning: SINGLE []
    Stage Execution Strategy: UNGROUPED_EXECUTION
    - Output[c_custkey, o_orderkey, o_orderstatus] => [[c_custkey, o_orderkey, o_orderstatus]]
        - RemoteSource[1] => [[c_custkey, o_orderstatus, o_orderkey]]

Fragment 1 [SOURCE]
    Output layout: [c_custkey, o_orderstatus, o_orderkey]
    Output partitioning: SINGLE []
    Stage Execution Strategy: UNGROUPED_EXECUTION
    - CrossJoin => [[c_custkey, o_orderstatus, o_orderkey]]
            Distribution: REPLICATED
        - ScanFilter[table = awsdatacatalog:HiveTableHandle{schemaName=tpch100, 
tableName=customer, analyzePartitionValues=Optional.empty}, grouped = false, 
filterPredicate = ("c_custkey" = 123)] => [[c_custkey]]
                LAYOUT: tpch100.customer
                c_custkey := c_custkey:int:0:REGULAR
        - LocalExchange[SINGLE] () => [[o_orderstatus, o_orderkey]]
            - RemoteSource[2] => [[o_orderstatus, o_orderkey]]

Fragment 2 [SOURCE]
    Output layout: [o_orderstatus, o_orderkey]
    Output partitioning: BROADCAST []
    Stage Execution Strategy: UNGROUPED_EXECUTION
    - ScanFilterProject[table = awsdatacatalog:HiveTableHandle{schemaName=tpch100, 
tableName=orders, analyzePartitionValues=Optional.empty}, grouped = false, 
filterPredicate = ("o_custkey" = 123)] => [[o_orderstatus, o_orderkey]]
            LAYOUT: tpch100.orders
            o_orderstatus := o_orderstatus:string:2:REGULAR
            o_custkey := o_custkey:int:1:REGULAR
            o_orderkey := o_orderkey:int:0:REGULAR
```

Contoh kueri dioptimalkan menjadi silang bergabung untuk performa yang lebih baik. Hasil menunjukkan bahwa`tpch100.orders`akan didistribusikan sebagai`BROADCAST`distribusi jenis. Ini berarti bahwa`tpch100.orders`tabel akan didistribusikan ke semua simpul yang melakukan operasi bergabung. Parameter`BROADCAST`jenis distribusi akan mengharuskan semua hasil disaring dari`tpch100.orders`tabel masuk ke dalam memori dari setiap simpul yang melakukan bergabung operasi.

Namun,`tpch100.customer`tabel lebih kecil dari`tpch100.orders`. Karena`tpch100.customer`membutuhkan lebih sedikit memori, Anda dapat menulis ulang kueri ke`BROADCAST tpch100.customer`Sebagai gantinya`tpch100.orders`. Ini mengurangi kemungkinan kueri menerima`EXCEEDED_LOCAL_MEMORY_LIMIT`kesalahan. Strategi ini mengasumsikan poin-poin berikut:
+ Parameter`tpch100.customer.c_custkey`unik di`tpch100.customer`tabel.
+ Ada hubungan one-to-many pemetaan antara `tpch100.customer` dan`tpch100.orders`.

Contoh berikut menunjukkan kueri ditulis ulang.

```
SELECT 
    c.c_custkey,
    o.o_orderkey,
    o.o_orderstatus
FROM tpch100.orders o
JOIN tpch100.customer c -- the filtered results of tpch100.customer are distributed to all nodes.
    ON c.c_custkey = o.o_custkey 
WHERE c.c_custkey = 123
```

### Contoh 5: Gunakan kueri EXPLOW untuk menghapus predikat yang tidak berpengaruh
<a name="athena-explain-statement-example-remove-unneeded-predicates"></a>

Anda dapat menggunakan`EXPLAIN`query untuk memeriksa efektivitas penyaringan predikat. Anda dapat menggunakan hasil untuk menghapus predikat yang tidak berpengaruh, seperti dalam contoh berikut.

```
EXPLAIN
   SELECT 
      c.c_name
   FROM tpch100.customer c
   WHERE c.c_custkey = CAST(RANDOM() * 1000 AS INT)
   AND c.c_custkey BETWEEN 1000 AND 2000
   AND c.c_custkey = 1500
```

#### Hasil
<a name="athena-explain-statement-example-remove-unneeded-predicates-results"></a>

```
Query Plan
- Output[c_name] => [[c_name]]
    - RemoteExchange[GATHER] => [[c_name]]
        - ScanFilterProject[table = 
awsdatacatalog:HiveTableHandle{schemaName=tpch100, 
tableName=customer, analyzePartitionValues=Optional.empty}, 
filterPredicate = (("c_custkey" = 1500) AND ("c_custkey" = 
CAST(("random"() * 1E3) AS int)))] => [[c_name]]
                LAYOUT: tpch100.customer
                c_custkey := c_custkey:int:0:REGULAR
                c_name := c_name:string:1:REGULAR
```

Parameter`filterPredicate`dalam hasil menunjukkan bahwa optimizer menggabungkan tiga predikat asli menjadi dua predikat dan mengubah urutan aplikasi mereka.

```
filterPredicate = (("c_custkey" = 1500) AND ("c_custkey" = CAST(("random"() * 1E3) AS int)))
```

Karena hasil menunjukkan bahwa predikat`AND c.c_custkey BETWEEN 1000 AND 2000`tidak berpengaruh, Anda dapat menghapus predikat ini tanpa mengubah hasil kueri.

Untuk informasi tentang istilah yang digunakan dalam hasil`EXPLAIN`kueri, lihat[Pahami Athena JELASKAN hasil pernyataan](athena-explain-statement-understanding.md).

## JELASKAN CONTOH ANALISIS
<a name="athena-explain-analyze-examples"></a>

Contoh berikut menunjukkan contoh `EXPLAIN ANALYZE` query dan output.

### Contoh 1: Gunakan EXPLOW ANALYZE untuk menampilkan rencana kueri dan biaya komputasi dalam format teks
<a name="athena-explain-analyze-example-cflogs-text"></a>

Dalam contoh berikut, `EXPLAIN ANALYZE` menunjukkan rencana eksekusi dan biaya komputasi untuk `SELECT` kueri pada CloudFront log. Format default ke output teks.

```
EXPLAIN ANALYZE SELECT FROM cloudfront_logs LIMIT 10
```

#### Hasil
<a name="athena-explain-analyze-example-cflogs-text-results"></a>

```
 Fragment 1
     CPU: 24.60ms, Input: 10 rows (1.48kB); per task: std.dev.: 0.00, Output: 10 rows (1.48kB)
     Output layout: [date, time, location, bytes, requestip, method, host, uri, status, referrer,\
       os, browser, browserversion]
Limit[10] => [[date, time, location, bytes, requestip, method, host, uri, status, referrer, os,\
  browser, browserversion]]
             CPU: 1.00ms (0.03%), Output: 10 rows (1.48kB)
             Input avg.: 10.00 rows, Input std.dev.: 0.00%
LocalExchange[SINGLE] () => [[date, time, location, bytes, requestip, method, host, uri, status, referrer, os,\
 browser, browserversion]]
                 CPU: 0.00ns (0.00%), Output: 10 rows (1.48kB)
                 Input avg.: 0.63 rows, Input std.dev.: 387.30%
RemoteSource[2] => [[date, time, location, bytes, requestip, method, host, uri, status, referrer, os,\
  browser, browserversion]]
                     CPU: 1.00ms (0.03%), Output: 10 rows (1.48kB)
                     Input avg.: 0.63 rows, Input std.dev.: 387.30%

 Fragment 2
     CPU: 3.83s, Input: 998 rows (147.21kB); per task: std.dev.: 0.00, Output: 20 rows (2.95kB)
     Output layout: [date, time, location, bytes, requestip, method, host, uri, status, referrer, os,\
       browser, browserversion]
LimitPartial[10] => [[date, time, location, bytes, requestip, method, host, uri, status, referrer, os,\
  browser, browserversion]]
             CPU: 5.00ms (0.13%), Output: 20 rows (2.95kB)
             Input avg.: 166.33 rows, Input std.dev.: 141.42%
TableScan[awsdatacatalog:HiveTableHandle{schemaName=default, tableName=cloudfront_logs,\
  analyzePartitionValues=Optional.empty}, 
grouped = false] => [[date, time, location, bytes, requestip, method, host, uri, st
                 CPU: 3.82s (99.82%), Output: 998 rows (147.21kB)
                 Input avg.: 166.33 rows, Input std.dev.: 141.42%
                 LAYOUT: default.cloudfront_logs
                 date := date:date:0:REGULAR
                 referrer := referrer:string:9:REGULAR
                 os := os:string:10:REGULAR
                 method := method:string:5:REGULAR
                 bytes := bytes:int:3:REGULAR
                 browser := browser:string:11:REGULAR
                 host := host:string:6:REGULAR
                 requestip := requestip:string:4:REGULAR
                 location := location:string:2:REGULAR
                 time := time:string:1:REGULAR
                 uri := uri:string:7:REGULAR
                 browserversion := browserversion:string:12:REGULAR
                 status := status:int:8:REGULAR
```

### Contoh 2: Gunakan EXPLOW ANALYZE untuk menampilkan rencana kueri dalam format JSON
<a name="athena-explain-analyze-example-cflogs-json"></a>

Contoh berikut menunjukkan rencana eksekusi dan biaya komputasi untuk `SELECT` kueri pada CloudFront log. Contoh menentukan JSON sebagai format output.

```
EXPLAIN ANALYZE (FORMAT JSON) SELECT * FROM cloudfront_logs LIMIT 10
```

#### Hasil
<a name="athena-explain-analyze-example-cflogs-json-results"></a>

```
{ 
    "fragments": [{ 
        "id": "1", 
 
        "stageStats": { 
            "totalCpuTime": "3.31ms", 
            "inputRows": "10 rows", 
            "inputDataSize": "1514B", 
            "stdDevInputRows": "0.00", 
            "outputRows": "10 rows", 
            "outputDataSize": "1514B" 
        }, 
        "outputLayout": "date, time, location, bytes, requestip, method, host,\
           uri, status, referrer, os, browser, browserversion", 
 
        "logicalPlan": { 
            "1": [{ 
                "name": "Limit", 
                "identifier": "[10]", 
                "outputs": ["date", "time", "location", "bytes", "requestip", "method", "host",\
                  "uri", "status", "referrer", "os", "browser", "browserversion"], 
                "details": "", 
                "distributedNodeStats": { 
                    "nodeCpuTime": "0.00ns", 
                    "nodeOutputRows": 10, 
                    "nodeOutputDataSize": "1514B", 
                    "operatorInputRowsStats": [{ 
                        "nodeInputRows": 10.0, 
                        "nodeInputRowsStdDev": 0.0 
                    }] 
                }, 
                "children": [{ 
                    "name": "LocalExchange", 
                    "identifier": "[SINGLE] ()", 
                    "outputs": ["date", "time", "location", "bytes", "requestip", "method", "host",\
                      "uri", "status", "referrer", "os", "browser", "browserversion"], 
                    "details": "", 
                    "distributedNodeStats": { 
                        "nodeCpuTime": "0.00ns", 
                        "nodeOutputRows": 10, 
                        "nodeOutputDataSize": "1514B", 
                        "operatorInputRowsStats": [{ 
                            "nodeInputRows": 0.625, 
                            "nodeInputRowsStdDev": 387.2983346207417 
                        }] 
                    }, 
                    "children": [{ 
                        "name": "RemoteSource", 
                        "identifier": "[2]", 
                        "outputs": ["date", "time", "location", "bytes", "requestip", "method", "host",\
                          "uri", "status", "referrer", "os", "browser", "browserversion"], 
                        "details": "", 
                        "distributedNodeStats": { 
                            "nodeCpuTime": "0.00ns", 
                            "nodeOutputRows": 10, 
                            "nodeOutputDataSize": "1514B", 
                            "operatorInputRowsStats": [{ 
                                "nodeInputRows": 0.625, 
                                "nodeInputRowsStdDev": 387.2983346207417 
                            }] 
                        }, 
                        "children": [] 
                    }] 
                }] 
            }] 
        } 
    }, { 
        "id": "2", 
 
        "stageStats": { 
            "totalCpuTime": "1.62s", 
            "inputRows": "500 rows", 
            "inputDataSize": "75564B", 
            "stdDevInputRows": "0.00", 
            "outputRows": "10 rows", 
            "outputDataSize": "1514B" 
        }, 
        "outputLayout": "date, time, location, bytes, requestip, method, host, uri, status,\
           referrer, os, browser, browserversion", 
 
        "logicalPlan": { 
            "1": [{ 
                "name": "LimitPartial", 
                "identifier": "[10]", 
                "outputs": ["date", "time", "location", "bytes", "requestip", "method", "host", "uri",\
                  "status", "referrer", "os", "browser", "browserversion"], 
                "details": "", 
                "distributedNodeStats": { 
                    "nodeCpuTime": "0.00ns", 
                    "nodeOutputRows": 10, 
                    "nodeOutputDataSize": "1514B", 
                    "operatorInputRowsStats": [{ 
                        "nodeInputRows": 83.33333333333333, 
                        "nodeInputRowsStdDev": 223.60679774997897 
                    }] 
                }, 
                "children": [{ 
                    "name": "TableScan", 
                    "identifier": "[awsdatacatalog:HiveTableHandle{schemaName=default,\
                       tableName=cloudfront_logs, analyzePartitionValues=Optional.empty},\
                       grouped = false]", 
                    "outputs": ["date", "time", "location", "bytes", "requestip", "method", "host", "uri",\
                       "status", "referrer", "os", "browser", "browserversion"], 
                    "details": "LAYOUT: default.cloudfront_logs\ndate := date:date:0:REGULAR\nreferrer :=\
                       referrer: string:9:REGULAR\nos := os:string:10:REGULAR\nmethod := method:string:5:\
                       REGULAR\nbytes := bytes:int:3:REGULAR\nbrowser := browser:string:11:REGULAR\nhost :=\
                       host:string:6:REGULAR\nrequestip := requestip:string:4:REGULAR\nlocation :=\
                       location:string:2:REGULAR\ntime := time:string:1: REGULAR\nuri := uri:string:7:\
                       REGULAR\nbrowserversion := browserversion:string:12:REGULAR\nstatus :=\
                       status:int:8:REGULAR\n", 
                    "distributedNodeStats": { 
                        "nodeCpuTime": "1.62s", 
                        "nodeOutputRows": 500, 
                        "nodeOutputDataSize": "75564B", 
                        "operatorInputRowsStats": [{ 
                            "nodeInputRows": 83.33333333333333, 
                            "nodeInputRowsStdDev": 223.60679774997897 
                        }] 
                    }, 
                    "children": [] 
                }] 
            }] 
        } 
    }] 
}
```

## Sumber daya tambahan
<a name="athena-explain-statement-additional-resources"></a>

Untuk informasi tambahan, lihat sumber daya berikut.
+  [Pahami Athena JELASKAN hasil pernyataan](athena-explain-statement-understanding.md)
+  [Lihat rencana eksekusi untuk kueri SQL](query-plans.md)
+  [Lihat statistik dan detail eksekusi untuk kueri yang diselesaikan](query-stats.md)
+ Dokumentasi Trino [https://trino.io/docs/current/sql/explain.html](https://trino.io/docs/current/sql/explain.html)
+ Dokumentasi Trino [https://trino.io/docs/current/sql/explain-analyze.html](https://trino.io/docs/current/sql/explain-analyze.html)
+  [Optimalkan Kinerja Kueri Federasi menggunakan JELASKAN dan JELASKAN ANALISIS di Amazon](https://aws.amazon.com/blogs/big-data/optimize-federated-query-performance-using-explain-and-explain-analyze-in-amazon-athena/) Athena di Blog *AWS Big* Data. 

[![AWS Videos](http://img.youtube.com/vi/https://www.youtube.com/embed/7JUyTqglmNU/0.jpg)](http://www.youtube.com/watch?v=https://www.youtube.com/embed/7JUyTqglmNU)


# Pahami Athena JELASKAN hasil pernyataan
<a name="athena-explain-statement-understanding"></a>

Topik ini memberikan panduan singkat untuk istilah operasional yang digunakan di Athena`EXPLAIN`.

## JELASKAN jenis keluaran pernyataan
<a name="athena-explain-statement-understanding-explain-plan-types"></a>

`EXPLAIN`output pernyataan dapat menjadi salah satu dari dua jenis:
+ **Rencana logis** - Menunjukkan rencana logis yang digunakan mesin SQL untuk mengeksekusi pernyataan. Sintaks untuk opsi ini`EXPLAIN`atau`EXPLAIN (TYPE LOGICAL)`.
+ **Rencana terdistribusi** - Menunjukkan rencana eksekusi di lingkungan terdistribusi. Output menunjukkan fragmen, yang memproses tahap. Setiap fragmen rencana diproses oleh satu atau lebih simpul. Data dapat dipertukarkan antara simpul yang memproses fragmen. Sintaks untuk opsi ini`EXPLAIN (TYPE DISTRIBUTED)`.

  Dalam output untuk rencana terdistribusi, fragmen (tahap pemrosesan) ditunjukkan oleh `Fragment` *number* [*fragment\$1type*], di mana *number* bilangan bulat berbasis nol dan *fragment\$1type* menentukan bagaimana fragmen dieksekusi oleh node. Jenis fragmen, yang memberikan wawasan tata letak Data Exchange, dijelaskan dalam tabel berikut.  
**Jenis fragmen rencana terdistribusi**    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/athena/latest/ug/athena-explain-statement-understanding.html)

## .exchange
<a name="athena-explain-statement-understanding-exchange-types"></a>

Istilah terkait pertukaran menggambarkan bagaimana data dipertukarkan antara simpul pekerja. Transfer dapat berupa lokal atau remote. 

**LocalExchange [*exchange\$1type*] **  
Transfer data secara lokal dalam simpul pekerja untuk berbagai tahap kueri. Nilai untuk *exchange\$1type* dapat menjadi salah satu jenis pertukaran logis atau terdistribusi seperti yang dijelaskan nanti di bagian ini.

**RemoteExchange [*exchange\$1type*] **  
Transfer data antara simpul pekerja untuk berbagai tahap kueri. Nilai untuk *exchange\$1type* dapat menjadi salah satu jenis pertukaran logis atau terdistribusi seperti yang dijelaskan nanti di bagian ini.

### Jenis Pertukaran Logis
<a name="athena-explain-statement-understanding-exchange-types-logical"></a>

Jenis pertukaran berikut menggambarkan tindakan yang diambil selama fase pertukaran dari rencana logis.
+ **`GATHER`**— Sebuah simpul pekerja tunggal mengumpulkan output dari semua simpul pekerja lainnya. Misalnya, tahap terakhir dari kueri pilih mengumpulkan hasil dari semua simpul dan menulis hasilnya ke Amazon S3.
+ **`REPARTITION`**— Mengirim data baris ke pekerja tertentu berdasarkan skema partisi yang diperlukan untuk diterapkan ke operator berikutnya.
+ **`REPLICATE`**— Salinan data baris untuk semua pekerja.

### Jenis Pertukaran Terdistribusi
<a name="athena-explain-statement-understanding-exchange-types-distributed"></a>

Jenis pertukaran berikut menunjukkan tata letak data saat mereka dipertukarkan antara simpul dalam rencana terdistribusi.
+ **`HASH`**— Pertukaran mendistribusikan data ke beberapa tujuan menggunakan fungsi hash.
+ **`SINGLE`**— Pertukaran mendistribusikan data ke satu tujuan.

## Pemindaian
<a name="athena-explain-statement-understanding-scanning"></a>

Istilah berikut menjelaskan bagaimana data dipindai selama kueri.

**TableScan **  
Memindai data sumber tabel dari Amazon S3 atau konektor Apache Hive dan berlaku pemangkasan partisi yang dihasilkan dari predikat filter.

**ScanFilter **  
Memindai data sumber tabel dari Amazon S3 atau konektor Hive dan berlaku pemangkasan partisi yang dihasilkan dari predikat filter dan dari predikat filter tambahan tidak diterapkan melalui pemangkasan partisi.

**ScanFilterProject **  
Pertama, memindai data sumber tabel dari Amazon S3 atau konektor Hive dan berlaku pemangkasan partisi yang dihasilkan dari predikat filter dan dari predikat filter tambahan tidak diterapkan melalui pemangkasan partisi. Kemudian, memodifikasi tata letak memori data output ke proyeksi baru untuk meningkatkan performa tahap selanjutnya.

## Join
<a name="athena-explain-statement-understanding-join"></a>

Bergabung data antara dua tabel. Bergabung dapat dikategorikan berdasarkan bergabung jenis dan jenis distribusi.

### Bergabunglah dengan tipe
<a name="athena-explain-statement-understanding-join-types"></a>

Bergabung jenis menentukan cara tempat bergabung operasi terjadi.

**CrossJoin**— Menghasilkan produk Cartesian dari dua tabel yang digabungkan.

**InnerJoin**— Memilih catatan yang memiliki nilai yang cocok di kedua tabel.

**LeftJoin**— Memilih semua catatan dari tabel kiri dan catatan yang cocok dari tabel kanan. Jika tidak ada pertandingan terjadi, hasil di sisi kanan adalah NULL.

**RightJoin**— Memilih semua catatan dari tabel kanan, dan catatan yang cocok dari tabel kiri. Jika tidak ada pertandingan terjadi, hasil di sisi kiri adalah NULL.

**FullJoin**— Memilih semua catatan di mana ada kecocokan di catatan tabel kiri atau kanan. Tabel gabungan berisi semua catatan dari kedua tabel dan mengisi NULLs untuk kecocokan yang hilang di kedua sisi.

**catatan**  
Untuk alasan performa, mesin permintaan dapat menulis ulang kueri bergabung ke jenis bergabung yang berbeda untuk menghasilkan hasil yang sama. Sebagai contoh, batin bergabung kueri dengan predikat pada satu tabel dapat ditulis ulang menjadi`CrossJoin`. Ini mendorong predikat ke fase pemindaian tabel sehingga data yang lebih sedikit dipindai.

### Bergabunglah dengan jenis distribusi
<a name="athena-explain-statement-understanding-join-distribution-types"></a>

jenis distribusi menentukan bagaimana data dipertukarkan antara simpul pekerja saat bergabung operasi dilakukan.

**Dipartisi**— Kedua tabel kiri dan kanan hash-dipartisi di semua simpul pekerja. distribusi dipartisi mengkonsumsi lebih sedikit memori di setiap simpul. distribusi dipartisi dapat jauh lebih lambat dari direplikasi bergabung. Dipartisi bergabung cocok saat Anda bergabung dua tabel besar.

**Replikasi**— Satu tabel hash-dipartisi di semua simpul pekerja dan tabel lainnya direplikasi ke semua simpul pekerja untuk melakukan operasi bergabung. Distribusi direplikasi dapat jauh lebih cepat daripada dipartisi bergabung, tetapi mengkonsumsi lebih banyak memori di setiap simpul pekerja. Jika tabel yang direplikasi terlalu besar, node pekerja dapat mengalami out-of-memory kesalahan. Replikasi bergabung cocok saat salah satu tabel bergabung kecil.

# MEMPERSIAPKAN
<a name="sql-prepare"></a>

Membuat pernyataan SQL dengan nama `statement_name` yang akan dijalankan di lain waktu. Pernyataan tersebut dapat mencakup parameter yang diwakili oleh tanda tanya. Untuk memberikan nilai untuk parameter dan menjalankan pernyataan yang disiapkan, gunakan[EXECUTE](sql-execute.md).

## Sinopsis
<a name="sql-prepare-synopsis"></a>

```
PREPARE statement_name FROM statement
```

Tabel berikut menjelaskan parameter.


****  

| Parameter | Deskripsi | 
| --- | --- | 
| statement\$1name | Nama pernyataan yang harus dipersiapkan. Nama dalam buket harus unik. | 
| statement | Kueri SELECT, CTAS, atau INSERT INTO. | 

**catatan**  
Jumlah maksimum pernyataan yang disiapkan dalam kelompok kerja adalah 1000.

## Contoh
<a name="sql-prepare-examples"></a>

Contoh berikut menyiapkan query pilih tanpa parameter.

```
PREPARE my_select1 FROM 
SELECT * FROM nation
```

Contoh berikut menyiapkan kueri pilih yang mencakup parameter. Nilai untuk `productid` dan `quantity` akan diberikan oleh `USING` klausa `EXECUTE` pernyataan:

```
PREPARE my_select2 FROM 
SELECT order FROM orders WHERE productid = ? and quantity < ?
```

Contoh berikut menyiapkan query insert.

```
PREPARE my_insert FROM 
INSERT INTO cities_usa (city, state) 
SELECT city, state 
FROM cities_world 
WHERE country = ?
```

## Sumber daya tambahan
<a name="sql-prepare-additional-resources"></a>

[Gunakan pernyataan yang disiapkan](querying-with-prepared-statements-querying.md)

[EXECUTE](sql-execute.md)

[DEALLOCATE PREPARE](sql-deallocate-prepare.md)

[INSERT INTO](insert-into.md)

# EXECUTE
<a name="sql-execute"></a>

Menjalankan pernyataan yang disiapkan dengan nama`statement_name`. Nilai parameter untuk tanda tanya dalam pernyataan yang disiapkan didefinisikan dalam `USING` klausa dalam daftar dipisahkan koma. Untuk membuat pernyataan yang disiapkan, gunakan[MEMPERSIAPKAN](sql-prepare.md).

## Sinopsis
<a name="sql-execute-synopsis"></a>

```
EXECUTE statement_name [ USING parameter1[, parameter2, ... ] ]
```

## Contoh
<a name="sql-execute-examples"></a>

Contoh berikut mempersiapkan dan mengeksekusi query tanpa parameter.

```
PREPARE my_select1 FROM 
SELECT name FROM nation 
EXECUTE my_select1
```

Contoh berikut mempersiapkan dan mengeksekusi query dengan parameter tunggal.

```
PREPARE my_select2 FROM 
SELECT * FROM "my_database"."my_table" WHERE year = ? 
EXECUTE my_select2 USING 2012
```

Ini setara dengan:

```
SELECT * FROM "my_database"."my_table" WHERE year = 2012
```

Contoh berikut mempersiapkan dan mengeksekusi query dengan dua parameter.

```
PREPARE my_select3 FROM 
SELECT order FROM orders WHERE productid = ? and quantity < ? 
EXECUTE my_select3 USING 346078, 12
```

## Sumber daya tambahan
<a name="sql-execute-additional-resources"></a>

[Gunakan pernyataan yang disiapkan](querying-with-prepared-statements-querying.md)

[MEMPERSIAPKAN](sql-prepare.md)

[INSERT INTO](insert-into.md)

# DEALLOCATE PREPARE
<a name="sql-deallocate-prepare"></a>

Menghapus pernyataan yang disiapkan dengan nama yang ditentukan dari pernyataan yang disiapkan dalam workgroup saat ini.

## Sinopsis
<a name="sql-deallocate-prepare-synopsis"></a>

```
DEALLOCATE PREPARE statement_name
```

## Contoh
<a name="sql-deallocate-prepare-examples"></a>

Contoh berikut menghapus pernyataan yang disiapkan `my_select1` dari grup kerja saat ini.

```
DEALLOCATE PREPARE my_select1
```

## Sumber daya tambahan
<a name="sql-deallocate-prepare-additional-resources"></a>

[Gunakan pernyataan yang disiapkan](querying-with-prepared-statements-querying.md)

[MEMPERSIAPKAN](sql-prepare.md)

# MEMBONGKAR
<a name="unload"></a>

Menulis hasil kueri dari `SELECT` pernyataan ke format data yang ditentukan. Format yang didukung untuk `UNLOAD` termasuk Apache Parquet, ORC, Apache Avro, dan JSON. CSV adalah satu-satunya format output yang didukung oleh perintah `SELECT` Athena, tetapi Anda dapat menggunakan `UNLOAD` perintah, yang mendukung berbagai format output, untuk melampirkan kueri `SELECT` Anda dan menulis ulang outputnya ke salah satu format yang mendukung. `UNLOAD` 

Meskipun Anda dapat menggunakan pernyataan `CREATE TABLE AS` (CTAS) untuk mengeluarkan data dalam format selain CSV, pernyataan CTAS memerlukan pembuatan tabel di Athena. `UNLOAD`Pernyataan ini berguna ketika Anda ingin menampilkan hasil `SELECT` kueri dalam format non-CSV tetapi tidak ingin tabel terkait. Misalnya, aplikasi hilir mungkin memerlukan hasil `SELECT` kueri dalam format JSON, dan Parquet atau ORC mungkin memberikan keunggulan kinerja dibandingkan CSV jika Anda bermaksud menggunakan hasil kueri untuk analisis tambahan. `SELECT`

## Pertimbangan dan batasan
<a name="unload-considerations-and-limitations"></a>

Saat Anda menggunakan `UNLOAD` pernyataan di Athena, ingatlah poin-poin berikut:
+ **Tidak ada urutan global file** — `UNLOAD` hasilnya ditulis ke beberapa file secara paralel. Jika `SELECT` kueri dalam `UNLOAD` pernyataan menentukan urutan pengurutan, isi setiap file dalam urutan diurutkan, tetapi file tidak diurutkan relatif satu sama lain.
+ **Data yatim piatu tidak dihapus** — Jika terjadi kegagalan, Athena tidak berusaha menghapus data yatim piatu. Perilaku ini sama dengan CTAS dan `INSERT INTO` pernyataan.
+ **Partisi maksimum** — Jumlah maksimum partisi yang dapat digunakan `UNLOAD` adalah 100.
+ File **metadata dan manifes — Athena menghasilkan file** metadata dan file manifes data untuk setiap kueri. `UNLOAD` Manifest melacak file yang kueri menulis. Kedua file disimpan ke lokasi hasil kueri Athena Anda di Amazon S3. Untuk informasi selengkapnya, lihat [Identifikasi file keluaran kueri](querying-finding-output-files.md#querying-identifying-output-files).
+ **Enkripsi** — file `UNLOAD` output dienkripsi sesuai dengan konfigurasi enkripsi yang digunakan untuk Amazon S3. Untuk mengatur konfigurasi enkripsi untuk mengenkripsi `UNLOAD` hasil Anda, Anda dapat menggunakan [EncryptionConfiguration API](https://docs.aws.amazon.com/athena/latest/APIReference/API_EncryptionConfiguration.html).
+ **Pernyataan yang disiapkan** - `UNLOAD` dapat digunakan dengan pernyataan yang disiapkan. Untuk informasi tentang pernyataan yang disiapkan di Athena, lihat. [Gunakan kueri berparameter](querying-with-prepared-statements.md)
+ **Kuota layanan** - `UNLOAD` menggunakan kuota kueri DML. Untuk informasi kuota, lihat[Service Quotas](service-limits.md).
+ **Pemilik bucket** yang diharapkan — Pengaturan pemilik bucket yang diharapkan tidak berlaku untuk lokasi Amazon S3 tujuan yang ditentukan dalam kueri. `UNLOAD` Setelan pemilik bucket yang diharapkan hanya berlaku untuk lokasi keluaran Amazon S3 yang Anda tentukan untuk hasil kueri Athena. Untuk informasi selengkapnya, lihat [Tentukan lokasi hasil kueri menggunakan konsol Athena](query-results-specify-location-console.md).

## Sintaksis
<a name="unload-syntax"></a>

`UNLOAD`Pernyataan ini menggunakan sintaks berikut.

```
UNLOAD (SELECT col_name[, ...] FROM old_table) 
TO 's3://amzn-s3-demo-bucket/my_folder/' 
WITH ( property_name = 'expression' [, ...] )
```

Kecuali saat menulis ke partisi, `TO` tujuan harus menentukan lokasi di Amazon S3 yang tidak memiliki data. Sebelum `UNLOAD` kueri menulis ke lokasi yang ditentukan, kueri memverifikasi bahwa lokasi bucket kosong. Karena `UNLOAD` tidak menulis data ke lokasi yang ditentukan jika lokasi sudah memiliki data di dalamnya, `UNLOAD` tidak menimpa data yang ada. Untuk menggunakan kembali lokasi bucket sebagai tujuan`UNLOAD`, hapus data di lokasi bucket, lalu jalankan kueri lagi. 

Perhatikan bahwa ketika `UNLOAD` menulis ke partisi, perilaku ini berbeda. Jika Anda menjalankan `UNLOAD` kueri yang sama beberapa kali yang memiliki `SELECT` pernyataan yang sama, `TO` lokasi yang sama, dan partisi yang sama, setiap `UNLOAD` kueri akan membongkar data ke Amazon S3 di lokasi dan partisi yang ditentukan.

### Parameter
<a name="unload-parameters"></a>

Nilai yang mungkin untuk *property\$1name* adalah sebagai berikut.

** format = '*file\$1format*' **  
Wajib. Menentukan format file output. Nilai yang mungkin untuk *file\$1format* adalah `ORC``PARQUET`,`AVRO`,`JSON`, atau`TEXTFILE`.

** kompresi = '*compression\$1format*' **  
Tidak wajib. Opsi ini khusus untuk format ORC dan Parket. Untuk ORC, defaultnya adalah`zlib`, dan untuk Parket, defaultnya adalah. `gzip` Untuk informasi tentang format kompresi yang didukung, lihat Dukungan [kompresi Athena](https://docs.aws.amazon.com/athena/latest/ug/compression-formats.html).   
Opsi ini tidak berlaku untuk `AVRO` format. Athena menggunakan `gzip` untuk `JSON` dan `TEXTFILE` format.

**kompresi\$1level = *compression\$1level* **  
Tidak wajib. Tingkat kompresi yang digunakan untuk kompresi ZSTD. Properti ini hanya berlaku untuk kompresi ZSTD. Untuk informasi selengkapnya, lihat [Gunakan tingkat kompresi ZSTD](compression-support-zstd-levels.md).

** field\$1delimiter = '' *delimiter* **  
Tidak wajib. Menentukan pembatas bidang karakter tunggal untuk file dalam CSV, TSV, dan format teks lainnya. Contoh berikut menentukan pembatas koma.  

```
WITH (field_delimiter = ',')
```
Saat ini, pembatas bidang multikarakter tidak didukung. Jika Anda tidak menentukan pembatas bidang, karakter oktal `\001` (^A) digunakan.

** partitioned\$1by = ARRAY [[,...]*col\$1name*] **  
Tidak wajib. Daftar array kolom dimana output dipartisi.  
Dalam `SELECT` pernyataan Anda, pastikan bahwa nama-nama kolom yang dipartisi terakhir dalam daftar kolom Anda. 

## Contoh
<a name="unload-examples"></a>

Contoh berikut menulis output dari `SELECT` query ke lokasi Amazon S3 `s3://amzn-s3-demo-bucket/unload_test_1/` menggunakan format JSON.

```
UNLOAD (SELECT * FROM old_table) 
TO 's3://amzn-s3-demo-bucket/unload_test_1/' 
WITH (format = 'JSON')
```

Contoh berikut menulis output dari `SELECT` query dalam format Parquet menggunakan kompresi Snappy.

```
UNLOAD (SELECT * FROM old_table) 
TO 's3://amzn-s3-demo-bucket/' 
WITH (format = 'PARQUET',compression = 'SNAPPY')
```

Contoh berikut menulis empat kolom dalam format teks, dengan output dipartisi oleh kolom terakhir.

```
UNLOAD (SELECT name1, address1, comment1, key1 FROM table1) 
TO 's3://amzn-s3-demo-bucket/ partitioned/' 
WITH (format = 'TEXTFILE', partitioned_by = ARRAY['key1'])
```

Contoh berikut membongkar hasil query ke lokasi yang ditentukan menggunakan format file Parquet, kompresi ZSTD, dan tingkat kompresi ZSTD 4.

```
UNLOAD (SELECT * FROM old_table) 
TO 's3://amzn-s3-demo-bucket/' 
WITH (format = 'PARQUET', compression = 'ZSTD', compression_level = 4)
```

## Sumber daya tambahan
<a name="unload-additional-resources"></a>
+ [Sederhanakan pipeline ETL dan ML Anda menggunakan fitur Amazon Athena UNLOAD](https://aws.amazon.com/blogs/big-data/simplify-your-etl-and-ml-pipelines-using-the-amazon-athena-unload-feature/) *di Big Data Blog.AWS * 

# Fungsi di Amazon Athena
<a name="functions"></a>

Untuk perubahan fungsi antara versi mesin Athena, lihat. [Pembuatan versi mesin Athena](engine-versions.md) Untuk daftar zona waktu yang dapat digunakan dengan`AT TIME ZONE`operator, lihat[Gunakan zona waktu yang didukung](athena-supported-time-zones.md).

**Topics**
+ [Mesin Athena versi 3](functions-env3.md)

# Fungsi mesin Athena versi 3
<a name="functions-env3"></a>

Fungsi di mesin Athena versi 3 didasarkan pada Trino. Untuk informasi tentang fungsi, operator, dan ekspresi Trino, lihat [Fungsi dan operator](https://trino.io/docs/current/functions.html) dan subbagian berikut dari dokumentasi Trino.
+  [Agregat](https://trino.io/docs/current/functions/aggregate.html) 
+  [Array](https://trino.io/docs/current/functions/array.html) 
+  [Biner](https://trino.io/docs/current/functions/binary.html) 
+  [Bitwise](https://trino.io/docs/current/functions/bitwise.html) 
+  [Warna](https://trino.io/docs/current/functions/color.html) 
+  [Perbandingan](https://trino.io/docs/current/functions/comparison.html) 
+  [Bersyarat](https://trino.io/docs/current/functions/conditional.html) 
+  [Konversi](https://trino.io/docs/current/functions/conversion.html) 
+  [Tanggal dan waktu](https://trino.io/docs/current/functions/datetime.html) 
+  [Desimal](https://trino.io/docs/current/functions/decimal.html) 
+  [Geospasial](https://trino.io/docs/current/functions/geospatial.html) 
+  [HyperLogLog](https://trino.io/docs/current/functions/hyperloglog.html) 
+  [Alamat IP](https://trino.io/docs/current/functions/ipaddress.html) 
+  [JSON](https://trino.io/docs/current/functions/json.html) 
+  [Lambda](https://trino.io/docs/current/functions/lambda.html) 
+  [Logis](https://trino.io/docs/current/functions/logical.html) 
+  [Pembelajaran mesin](https://trino.io/docs/current/functions/ml.html) 
+  [Peta](https://trino.io/docs/current/functions/map.html) 
+  [Matematika](https://trino.io/docs/current/functions/math.html) 
+  [Intisari kuantil](https://trino.io/docs/current/functions/qdigest.html) 
+  [Ekspresi reguler](https://trino.io/docs/current/functions/regexp.html) 
+  [Sesi](https://trino.io/docs/current/functions/session.html) 
+  [Set Intisari](https://trino.io/docs/current/functions/setdigest.html) 
+  [Tali](https://trino.io/docs/current/functions/string.html) 
+  [Tabel](https://trino.io/docs/current/functions/table.html) 
+  [Teradata](https://trino.io/docs/current/functions/teradata.html) 
+  [T-Digest](https://trino.io/docs/current/functions/tdigest.html) 
+  [URL](https://trino.io/docs/current/functions/url.html) 
+  [UUID](https://trino.io/docs/current/functions/uuid.html) 
+  [Jendela](https://trino.io/docs/current/functions/window.html) 

## fungsi invoker\$1principal ()
<a name="functions-env3-invoker-principal"></a>

`invoker_principal`Fungsi ini unik untuk mesin Athena versi 3 dan tidak ditemukan di Trino.

Mengembalikan `VARCHAR` yang berisi ARN dari prinsipal (peran IAM atau identitas Pusat Identitas) yang menjalankan query memanggil fungsi. Misalnya, jika pemanggil kueri menggunakan izin peran IAM untuk menjalankan kueri, fungsi mengembalikan ARN dari peran IAM. Peran yang menjalankan kueri harus mengizinkan `LakeFormation:GetDataLakePrincipal` tindakan. 

### Penggunaan
<a name="functions-invoker-principal-usage"></a>

```
SELECT invoker_principal()
```

Tabel berikut menunjukkan hasil contoh.


****  

| \$1 | \$1col0 | 
| --- | --- | 
| 1 | arn:aws:iam: ::peran/admin 111122223333 | 

# Gunakan zona waktu yang didukung
<a name="athena-supported-time-zones"></a>

Anda dapat menggunakan `AT TIME ZONE` operator dalam `SELECT timestamp` pernyataan untuk menentukan zona waktu untuk stempel waktu yang dikembalikan, seperti pada contoh berikut:

```
SELECT timestamp '2012-10-31 01:00 UTC' AT TIME ZONE 'America/Los_Angeles' AS la_time;
```

**Hasil**

```
la_time

2012-10-30 18:00:00.000 America/Los_Angeles
```

Untuk daftar zona waktu yang didukung di Athena, perluas [Daftar zona waktu yang didukung](#athena-supported-time-zones-list) di akhir topik ini.

## Fungsi dan contoh zona waktu
<a name="athena-supported-time-zones-functions-examples"></a>

Berikut ini adalah beberapa fungsi dan contoh terkait zona waktu tambahan.
+ **at\$1timezone (*timestamp*,*zone*)** - Mengembalikan nilai *timestamp* dalam waktu lokal yang sesuai untuk. *zone*

  **Contoh**

  ```
  SELECT at_timezone(timestamp '2021-08-22 00:00 UTC', 'Canada/Newfoundland')
  ```

  **Hasil**

  ```
  2021-08-21 21:30:00.000 Canada/Newfoundland
  ```
+ **timezone\$1hour (*timestamp*)** - Mengembalikan jam zona waktu offset dari stempel waktu sebagai. `bigint`

  **Contoh**

  ```
  SELECT timezone_hour(timestamp '2021-08-22 04:00 UTC' AT TIME ZONE 'Canada/Newfoundland')
  ```

  **Hasil**

  ```
  -2
  ```
+ **timezone\$1minute (*timestamp*)** - Mengembalikan menit zona waktu offset dari sebagai. *timestamp* `bigint`

  **Contoh**

  ```
  SELECT timezone_minute(timestamp '2021-08-22 04:00 UTC' AT TIME ZONE 'Canada/Newfoundland')
  ```

  **Hasil**

  ```
  -30
  ```
+ **with\$1timezone (*timestamp*,*zone*)** - Mengembalikan timestamp dengan zona waktu dari yang ditentukan dan nilai-nilai. *timestamp* *zone*

  **Contoh**

  ```
  SELECT with_timezone(timestamp '2021-08-22 04:00', 'Canada/Newfoundland')
  ```

  **Hasil**

  ```
  2021-08-22 04:00:00.000 Canada/Newfoundland
  ```

## Daftar zona waktu yang didukung
<a name="athena-supported-time-zones-list"></a>

Daftar berikut berisi zona waktu yang dapat digunakan dengan`AT TIME ZONE`Operator di Athena. Untuk fungsi dan contoh terkait zona waktu tambahan, lihat[Fungsi dan contoh zona waktu](#athena-supported-time-zones-functions-examples).

```
Africa/Abidjan
Africa/Accra
Africa/Addis_Ababa
Africa/Algiers
Africa/Asmara
Africa/Asmera
Africa/Bamako
Africa/Bangui
Africa/Banjul
Africa/Bissau
Africa/Blantyre
Africa/Brazzaville
Africa/Bujumbura
Africa/Cairo
Africa/Casablanca
Africa/Ceuta
Africa/Conakry
Africa/Dakar
Africa/Dar_es_Salaam
Africa/Djibouti
Africa/Douala
Africa/El_Aaiun
Africa/Freetown
Africa/Gaborone
Africa/Harare
Africa/Johannesburg
Africa/Juba
Africa/Kampala
Africa/Khartoum
Africa/Kigali
Africa/Kinshasa
Africa/Lagos
Africa/Libreville
Africa/Lome
Africa/Luanda
Africa/Lubumbashi
Africa/Lusaka
Africa/Malabo
Africa/Maputo
Africa/Maseru
Africa/Mbabane
Africa/Mogadishu
Africa/Monrovia
Africa/Nairobi
Africa/Ndjamena
Africa/Niamey
Africa/Nouakchott
Africa/Ouagadougou
Africa/Porto-Novo
Africa/Sao_Tome
Africa/Timbuktu
Africa/Tripoli
Africa/Tunis
Africa/Windhoek
America/Adak
America/Anchorage
America/Anguilla
America/Antigua
America/Araguaina
America/Argentina/Buenos_Aires
America/Argentina/Catamarca
America/Argentina/ComodRivadavia
America/Argentina/Cordoba
America/Argentina/Jujuy
America/Argentina/La_Rioja
America/Argentina/Mendoza
America/Argentina/Rio_Gallegos
America/Argentina/Salta
America/Argentina/San_Juan
America/Argentina/San_Luis
America/Argentina/Tucuman
America/Argentina/Ushuaia
America/Aruba
America/Asuncion
America/Atikokan
America/Atka
America/Bahia
America/Bahia_Banderas
America/Barbados
America/Belem
America/Belize
America/Blanc-Sablon
America/Boa_Vista
America/Bogota
America/Boise
America/Buenos_Aires
America/Cambridge_Bay
America/Campo_Grande
America/Cancun
America/Caracas
America/Catamarca
America/Cayenne
America/Cayman
America/Chicago
America/Chihuahua
America/Coral_Harbour
America/Cordoba
America/Costa_Rica
America/Creston
America/Cuiaba
America/Curacao
America/Danmarkshavn
America/Dawson
America/Dawson_Creek
America/Denver
America/Detroit
America/Dominica
America/Edmonton
America/Eirunepe
America/El_Salvador
America/Ensenada
America/Fort_Nelson
America/Fort_Wayne
America/Fortaleza
America/Glace_Bay
America/Godthab
America/Goose_Bay
America/Grand_Turk
America/Grenada
America/Guadeloupe
America/Guatemala
America/Guayaquil
America/Guyana
America/Halifax
America/Havana
America/Hermosillo
America/Indiana/Indianapolis
America/Indiana/Knox
America/Indiana/Marengo
America/Indiana/Petersburg
America/Indiana/Tell_City
America/Indiana/Vevay
America/Indiana/Vincennes
America/Indiana/Winamac
America/Indianapolis
America/Inuvik
America/Iqaluit
America/Jamaica
America/Jujuy
America/Juneau
America/Kentucky/Louisville
America/Kentucky/Monticello
America/Knox_IN
America/Kralendijk
America/La_Paz
America/Lima
America/Los_Angeles
America/Louisville
America/Lower_Princes
America/Maceio
America/Managua
America/Manaus
America/Marigot
America/Martinique
America/Matamoros
America/Mazatlan
America/Mendoza
America/Menominee
America/Merida
America/Metlakatla
America/Mexico_City
America/Miquelon
America/Moncton
America/Monterrey
America/Montevideo
America/Montreal
America/Montserrat
America/Nassau
America/New_York
America/Nipigon
America/Nome
America/Noronha
America/North_Dakota/Beulah
America/North_Dakota/Center
America/North_Dakota/New_Salem
America/Ojinaga
America/Panama
America/Pangnirtung
America/Paramaribo
America/Phoenix
America/Port-au-Prince
America/Port_of_Spain
America/Porto_Acre
America/Porto_Velho
America/Puerto_Rico
America/Punta_Arenas
America/Rainy_River
America/Rankin_Inlet
America/Recife
America/Regina
America/Resolute
America/Rio_Branco
America/Rosario
America/Santa_Isabel
America/Santarem
America/Santiago
America/Santo_Domingo
America/Sao_Paulo
America/Scoresbysund
America/Shiprock
America/Sitka
America/St_Barthelemy
America/St_Johns
America/St_Kitts
America/St_Lucia
America/St_Thomas
America/St_Vincent
America/Swift_Current
America/Tegucigalpa
America/Thule
America/Thunder_Bay
America/Tijuana
America/Toronto
America/Tortola
America/Vancouver
America/Virgin
America/Whitehorse
America/Winnipeg
America/Yakutat
America/Yellowknife
Antarctica/Casey
Antarctica/Davis
Antarctica/DumontDUrville
Antarctica/Macquarie
Antarctica/Mawson
Antarctica/McMurdo
Antarctica/Palmer
Antarctica/Rothera
Antarctica/South_Pole
Antarctica/Syowa
Antarctica/Troll
Antarctica/Vostok
Arctic/Longyearbyen
Asia/Aden
Asia/Almaty
Asia/Amman
Asia/Anadyr
Asia/Aqtau
Asia/Aqtobe
Asia/Ashgabat
Asia/Ashkhabad
Asia/Atyrau
Asia/Baghdad
Asia/Bahrain
Asia/Baku
Asia/Bangkok
Asia/Barnaul
Asia/Beirut
Asia/Bishkek
Asia/Brunei
Asia/Calcutta
Asia/Chita
Asia/Choibalsan
Asia/Chongqing
Asia/Chungking
Asia/Colombo
Asia/Dacca
Asia/Damascus
Asia/Dhaka
Asia/Dili
Asia/Dubai
Asia/Dushanbe
Asia/Gaza
Asia/Harbin
Asia/Hebron
Asia/Ho_Chi_Minh
Asia/Hong_Kong
Asia/Hovd
Asia/Irkutsk
Asia/Istanbul
Asia/Jakarta
Asia/Jayapura
Asia/Jerusalem
Asia/Kabul
Asia/Kamchatka
Asia/Karachi
Asia/Kashgar
Asia/Kathmandu
Asia/Katmandu
Asia/Khandyga
Asia/Kolkata
Asia/Krasnoyarsk
Asia/Kuala_Lumpur
Asia/Kuching
Asia/Kuwait
Asia/Macao
Asia/Macau
Asia/Magadan
Asia/Makassar
Asia/Manila
Asia/Muscat
Asia/Nicosia
Asia/Novokuznetsk
Asia/Novosibirsk
Asia/Omsk
Asia/Oral
Asia/Phnom_Penh
Asia/Pontianak
Asia/Pyongyang
Asia/Qatar
Asia/Qyzylorda
Asia/Rangoon
Asia/Riyadh
Asia/Saigon
Asia/Sakhalin
Asia/Samarkand
Asia/Seoul
Asia/Shanghai
Asia/Singapore
Asia/Srednekolymsk
Asia/Taipei
Asia/Tashkent
Asia/Tbilisi
Asia/Tehran
Asia/Tel_Aviv
Asia/Thimbu
Asia/Thimphu
Asia/Tokyo
Asia/Tomsk
Asia/Ujung_Pandang
Asia/Ulaanbaatar
Asia/Ulan_Bator
Asia/Urumqi
Asia/Ust-Nera
Asia/Vientiane
Asia/Vladivostok
Asia/Yakutsk
Asia/Yangon
Asia/Yekaterinburg
Asia/Yerevan
Atlantic/Azores
Atlantic/Bermuda
Atlantic/Canary
Atlantic/Cape_Verde
Atlantic/Faeroe
Atlantic/Faroe
Atlantic/Jan_Mayen
Atlantic/Madeira
Atlantic/Reykjavik
Atlantic/South_Georgia
Atlantic/St_Helena
Atlantic/Stanley
Australia/ACT
Australia/Adelaide
Australia/Brisbane
Australia/Broken_Hill
Australia/Canberra
Australia/Currie
Australia/Darwin
Australia/Eucla
Australia/Hobart
Australia/LHI
Australia/Lindeman
Australia/Lord_Howe
Australia/Melbourne
Australia/NSW
Australia/North
Australia/Perth
Australia/Queensland
Australia/South
Australia/Sydney
Australia/Tasmania
Australia/Victoria
Australia/West
Australia/Yancowinna
Brazil/Acre
Brazil/DeNoronha
Brazil/East
Brazil/West
CET
CST6CDT
Canada/Atlantic
Canada/Central
Canada/Eastern
Canada/Mountain
Canada/Newfoundland
Canada/Pacific
Canada/Saskatchewan
Canada/Yukon
Chile/Continental
Chile/EasterIsland
Cuba
EET
EST5EDT
Egypt
Eire
Europe/Amsterdam
Europe/Andorra
Europe/Astrakhan
Europe/Athens
Europe/Belfast
Europe/Belgrade
Europe/Berlin
Europe/Bratislava
Europe/Brussels
Europe/Bucharest
Europe/Budapest
Europe/Busingen
Europe/Chisinau
Europe/Copenhagen
Europe/Dublin
Europe/Gibraltar
Europe/Guernsey
Europe/Helsinki
Europe/Isle_of_Man
Europe/Istanbul
Europe/Jersey
Europe/Kaliningrad
Europe/Kiev
Europe/Kirov
Europe/Lisbon
Europe/Ljubljana
Europe/London
Europe/Luxembourg
Europe/Madrid
Europe/Malta
Europe/Mariehamn
Europe/Minsk
Europe/Monaco
Europe/Moscow
Europe/Nicosia
Europe/Oslo
Europe/Paris
Europe/Podgorica
Europe/Prague
Europe/Riga
Europe/Rome
Europe/Samara
Europe/San_Marino
Europe/Sarajevo
Europe/Simferopol
Europe/Skopje
Europe/Sofia
Europe/Stockholm
Europe/Tallinn
Europe/Tirane
Europe/Tiraspol
Europe/Ulyanovsk
Europe/Uzhgorod
Europe/Vaduz
Europe/Vatican
Europe/Vienna
Europe/Vilnius
Europe/Volgograd
Europe/Warsaw
Europe/Zagreb
Europe/Zaporozhye
Europe/Zurich
GB
GB-Eire
Hongkong
Iceland
Indian/Antananarivo
Indian/Chagos
Indian/Christmas
Indian/Cocos
Indian/Comoro
Indian/Kerguelen
Indian/Mahe
Indian/Maldives
Indian/Mauritius
Indian/Mayotte
Indian/Reunion
Iran
Israel
Jamaica
Japan
Kwajalein
Libya
MET
MST7MDT
Mexico/BajaNorte
Mexico/BajaSur
Mexico/General
NZ
NZ-CHAT
Navajo
PRC
PST8PDT
Pacific/Apia
Pacific/Auckland
Pacific/Bougainville
Pacific/Chatham
Pacific/Chuuk
Pacific/Easter
Pacific/Efate
Pacific/Enderbury
Pacific/Fakaofo
Pacific/Fiji
Pacific/Funafuti
Pacific/Galapagos
Pacific/Gambier
Pacific/Guadalcanal
Pacific/Guam
Pacific/Honolulu
Pacific/Johnston
Pacific/Kiritimati
Pacific/Kosrae
Pacific/Kwajalein
Pacific/Majuro
Pacific/Marquesas
Pacific/Midway
Pacific/Nauru
Pacific/Niue
Pacific/Norfolk
Pacific/Noumea
Pacific/Pago_Pago
Pacific/Palau
Pacific/Pitcairn
Pacific/Pohnpei
Pacific/Ponape
Pacific/Port_Moresby
Pacific/Rarotonga
Pacific/Saipan
Pacific/Samoa
Pacific/Tahiti
Pacific/Tarawa
Pacific/Tongatapu
Pacific/Truk
Pacific/Wake
Pacific/Wallis
Pacific/Yap
Poland
Portugal
ROK
Singapore
Turkey
US/Alaska
US/Aleutian
US/Arizona
US/Central
US/East-Indiana
US/Eastern
US/Hawaii
US/Indiana-Starke
US/Michigan
US/Mountain
US/Pacific
US/Pacific-New
US/Samoa
W-SU
WET
```