

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# 自動クエリ書き換え
<a name="automatic-query-rewriting"></a>

Amazon Redshift では、パフォーマンス向上のために使用される既存のマテリアライズドビューを明示的に参照しない SQL クエリを、自動的に書き換えることができます。マテリアライズドビューを直接クエリするとクエリの処理時間は短縮されますが、クエリステートメントを変更する必要があります。マテリアライズドビューを使用してクエリを高速化する場合、マテリアライズドビューを体系的かつ自動的に使用してクエリに応答する方法を検討することが重要です。透過的な書き換えを使用すると、既存の SQL ステートメントに影響を与えることなく、インデックスと同じ方法でマテリアライズドビューを追加または削除できます。Amazon Redshift は、クエリを自動で書き換える際に、最新のマテリアライズドビューのみを使用します。

## クエリ書き換えの仕組み
<a name="query-rewriting-works"></a>

次の SQL クエリについて考えてみましょう。このクエリは、顧客 (1,000 万行以上) と注文 (100 億行以上) の 2 つのテーブルを結合します。

```
SELECT c.cust_id,  
       c.first_name,  
       sum(o.amount) as total_amount
FROM orders o  
JOIN customer c 
  ON c.cust_id = o.customer_id
GROUP BY c.cust_id,  
         c.first_name
HAVING sum(o.amount) > 500;
```

このクエリは 2 つの大きなテーブルを結合し、`o.amount` 列にその SUM 集約を適用します。それから結果をフィルタリングして、500 USD 以上の注文を行った顧客のみを表示します。このクエリは大量のリソースを消費する可能性があります。

例えば、このガイドの「[マテリアライズドビューの作成](creating-materialized-views.md)」セクションから、`mv_total_orders` のマテリアライズドビューについて考えてみましょう。このビューが作成されると、Amazon Redshift は前のクエリを次のように自動的に書き換えます。

```
SELECT cust_id,
       first_name,
       total_amount
FROM mv_total_orders
WHERE total_amount > 500;
```

この新しいクエリは、2 つの大きなテーブルを結合する代わりにマテリアライズドビューを使用するため、はるかに高速に実行されます。

クエリの書き換えによってマテリアライズドビューが広く採用されるようになったのは、以下の理由からです。

1. マテリアライズドビューはクエリの透過的な書き換えをサポートします。クエリの書き換えは、テーブルで表される SQL ステートメントを 1 つ以上のマテリアライズドビューにアクセスするステートメントに変換します。この変換はエンドユーザーには分かりやすく、介入する必要も、SQL ステートメントのマテリアライズドビューを参照する必要もありません。

1. マテリアライズドビューは、キャッシュされた共通結果セットの適用を簡素化し、事前計算などクロスクエリの最適化をサポートします。

1. データウェアハウスやデータ統合シナリオでは、マテリアライズドビューは外部テーブルの結果をマテリアライズして、ローカルレプリカや読み取り/書き込み分割を実装することで、複数のデータソース間の違いを隠すことができます。

1. クエリの書き換え機能とマテリアライズドビューの自動作成を組み合わせることで、データベースの自律性が向上します。