

# CTAS クエリに関する考慮事項と制約事項
<a name="ctas-considerations-limitations"></a>

以下のセクションでは、Athena で `CREATE TABLE AS SELECT` (CTAS) クエリを使用する際に留意すべき考慮事項と制限事項について説明します。

## CTAS クエリ構文について知る
<a name="ctas-considerations-limitations-query-syntax"></a>

CTAS クエリ構文は、テーブル作成用の `CREATE [EXTERNAL] TABLE` 構文とは異なります。「[CREATE TABLE AS](create-table-as.md)」を参照してください。

## ビューと CTAS クエリの違い
<a name="ctas-considerations-limitations-queries-vs-views"></a>

CTAS クエリは、Amazon S3 内の指定された場所に新しいデータを書き込みます。ビューはデータを書き込みません。

## CTAS クエリ結果の場所を指定する
<a name="ctas-considerations-limitations-location-of-query-results"></a>

ワークグループがクエリ結果の場所に関する[クライアント側の設定を上書きする](workgroups-settings-override.md)場合、Athena は `s3://amzn-s3-demo-bucket/tables/<query-id>/` の場所にテーブルを作成します。ワークグループに指定されたクエリ結果の場所を表示するには、[ワークグループの詳細を表示します](viewing-details-workgroups.md)。

ワークグループがクエリ結果の場所を上書きしない場合は、CTAS クエリの構文 `WITH (external_location ='s3://amzn-s3-demo-bucket/')` を使用して、CTAS クエリ結果の保存場所を指定できます。

**注記**  
`external_location` プロパティは、空の場所を指定する必要があります。CTAS クエリはバケットのパス位置 (プレフィックス) が空であるかどうかをチェックして、その場所に既にデータが含まれる場合は、データを上書きしません。同じ場所を再度使用するには、バケット内のキープレフィックスの場所のデータを削除します。

`external_location` 構文を省略しており、ワークグループ設定を使用していない場合、Athena はクエリ結果の場所に[クライアント側の設定](query-results-specify-location-console.md)を使用し、`s3://amzn-s3-demo-bucket/<Unsaved-or-query-name>/<year>/<month/<date>/tables/<query-id>/` の場所にテーブルを作成します。

## 孤立したファイルを見つける
<a name="ctas-considerations-limitations-locating-orphaned-files"></a>

`CTAS` または `INSERT INTO` ステートメントが失敗した場合、孤立したデータファイルがターゲットデータの場所に残っている、またはクエリがキャンセルされる可能性があります。Athena は場合によってはクエリのターゲットバケットからデータを削除しないため、後続のクエリでこの部分データが含まれる可能性があります。

検査または削除する孤立したファイルを見つけるには、Athena に用意されているデータマニフェストファイルを使用して、書き込まれるファイルのリストを追跡できます。Athena クエリが突然失敗したまれなケースでは、マニフェストファイルが存在しないことがあります。ターゲット S3 の場所を手動で確認して、孤立したファイルを見つけることができます。詳細については、「[クエリ出力ファイルの識別](querying-finding-output-files.md#querying-identifying-output-files)」および「[DataManifestLocation](https://docs.aws.amazon.com/athena/latest/APIReference/API_QueryExecutionStatistics.html#athena-Type-QueryExecutionStatistics-DataManifestLocation)」を参照してください。

テーブルのアトミックトランザクションを実現するには、Apache Iceberg を使用することを強くお勧めします。詳細については、「[Apache Iceberg テーブルをクエリする](querying-iceberg.md)」を参照してください。

## ORDER BY 句は無視されることに留意してください
<a name="ctas-considerations-limitations-order-by-ignored"></a>

CTAS クエリでは、Athena はクエリの `SELECT` 部分にある `ORDER BY` 句を無視します。

SQL 仕様 (ISO 9075 Part 2) では、クエリ式で指定されたテーブル行の順序が保証されるのは、`ORDER BY` 句が直後に含まれるクエリ式だけです。SQL のテーブルはどのような場合でも本来は順序付けられておらず、`ORDER BY` をサブクエリ句に追加してもクエリのパフォーマンスが低下するだけで、出力は順序付けられません。したがって、Athena CTAS クエリでは、データが書き込まされた際に `ORDER BY` 句によって指定された順序が保持される保証はありません。

## クエリ結果を保存する形式を選択する
<a name="ctas-considerations-limitations-formats-for-query-results"></a>

CTAS の結果は、`PARQUET`、`ORC`、`AVRO`、`JSON`、および `TEXTFILE` で保存できます。CTAS `TEXTFILE` 形式では複数文字の区切り文字がサポートされません。データの保存形式を指定しない場合、CTAS クエリ結果はデフォルトで Parquet に保存されます。

CTAS クエリでは形式の変換を解釈するために SerDe を指定する必要はありません。「[Example: Writing query results to a different format](ctas-examples.md#ctas-example-format)」を参照してください。

## 圧縮形式を検討する
<a name="ctas-considerations-limitations-compression-formats"></a>

JSON 形式と TEXTFILE 形式の CTAS クエリ結果には、`GZIP` 圧縮が使用されます。Parquet の場合、デフォルトは `GZIP` で、`GZIP` または `SNAPPY` も使用可能です。ORC の場合、デフォルトは `ZLIB` で、`LZ4`、`SNAPPY`、`ZLIB`、または `ZSTD` も使用できます。圧縮を指定する CTAS の例については、[Example: Specifying data storage and compression formats](ctas-examples.md#ctas-example-compression) を参照してください。Athena での圧縮の詳細については、「[Athena で圧縮を使用する](compression-formats.md)」を参照してください。

## 結果をパーティショニングおよびバケット化する
<a name="ctas-considerations-limitations-partition-and-bucket-limits"></a>

CTAS クエリの結果データをパーティションおよびバケット化することができます。宛先テーブルのプロパティを指定するには、`WITH` 句の最後にパーティショニング述語およびバケット述語を含めます。詳細については、「[パーティショニングとバケット化を使用する](ctas-partitioning-and-bucketing.md)」および「[Example: Creating bucketed and partitioned tables](ctas-examples.md#ctas-example-bucketed)」を参照してください。

CTAS を使用してパーティショニングされたテーブルを作成する場合、Athena には 100 のパーティションの書き込み制限があります。100 パーティションの制限を回避する方法については、「[CTAS および INSERT INTO を使用して 100 パーティションの制限を回避する](ctas-insert-into.md)」を参照してください。

## 結果を暗号化する
<a name="ctas-considerations-limitations-encryption"></a>

CTAS クエリの結果は Amazon S3 で暗号化することができます。これは Athena で他のクエリ結果を暗号化する方法と似ています。詳細については、「[Amazon S3 に保存された Athena クエリ結果を暗号化する](encrypting-query-results-stored-in-s3.md)」を参照してください。

## 想定されるバケット所有者設定は CTAS には適用されません
<a name="ctas-considerations-limitations-expected-bucket-owner"></a>

CTAS ステートメントの場合、予想されるバケット所有者の設定は、Amazon S3 内の送信先テーブルの場所には適用されません。予期されるバケット所有者の設定は、Athena クエリの結果の出力先として指定した Amazon S3 内の場所にのみ適用されます。詳細については、「[Athena コンソールを使用してクエリ結果の場所を指定する](query-results-specify-location-console.md)」を参照してください。

## 列のデータ型は保持されます
<a name="ctas-considerations-limitations-data-types"></a>

CTAS クエリの列のデータ型は元のクエリに指定されているものと同じです。