

 Amazon Redshift は、パッチ 198 以降、新しい Python UDF の作成をサポートしなくなります。既存の Python UDF は、2026 年 6 月 30 日まで引き続き機能します。詳細については、[ブログ記事](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/)を参照してください。

# マテリアライズドビューを使用するための自動クエリ書き換え
<a name="materialized-view-auto-rewrite"></a>

Amazon Redshift でマテリアライズドビューの自動クエリ書き換えを使用すると、その Amazon Redshift がマテリアライズドビューを使用するようにクエリを修正できます。これにより、マテリアライズドビューを明示的に参照しないクエリについても、そのワークロードが高速化されます。Amazon Redshift は、クエリを書き換える際に、最新 のマテリアライズドビューのみを使用します。

## 使用に関する注意事項
<a name="mv_auto-rewrite_usage"></a>

クエリに対してクエリの自動書き換えが使用されているかどうかを確認するには、クエリプランまたは STL\_EXPLAIN を調べます。次に、元のクエリプランの SELECT ステートメントと、EXPLAIN 出力を示します。

```
SELECT catgroup, SUM(qtysold) AS sold
FROM category c, event e, sales s
WHERE c.catid = e.catid AND e.eventid = s.eventid
GROUP BY 1;

EXPLAIN 
 XN HashAggregate  (cost=920021.24..920021.24 rows=1 width=35)
   ->  XN Hash Join DS_BCAST_INNER  (cost=440004.53..920021.22 rows=4 width=35)
         Hash Cond: ("outer".eventid = "inner".eventid)
         ->  XN Seq Scan on sales s  (cost=0.00..7.40 rows=740 width=6)
         ->  XN Hash  (cost=440004.52..440004.52 rows=1 width=37)
               ->  XN Hash Join DS_BCAST_INNER  (cost=0.01..440004.52 rows=1 width=37)
                     Hash Cond: ("outer".catid = "inner".catid)
                     ->  XN Seq Scan on event e  (cost=0.00..2.00 rows=200 width=6)
                     ->  XN Hash  (cost=0.01..0.01 rows=1 width=35)
                           ->  XN Seq Scan on category c  (cost=0.00..0.01 rows=1 width=35)
```

次に、自動書き換えに成功した後の EXPLAIN からの出力を示します。この出力には、既存のクエリプランの一部を置き換えるクエリプランによる、マテリアライズドビューに対するスキャンが含まれます。

```
* EXPLAIN 
     XN HashAggregate  (cost=11.85..12.35 rows=200 width=41)
       ->  XN Seq Scan on mv_tbl__tickets_mv__0 derived_table1  (cost=0.00..7.90 rows=790 width=41)
```

自動、スケジュール済み、手動などの更新戦略に関係なく、クエリの自動書き換えには、最新の (新しい) マテリアライズドビューのみが考慮されます。したがって、元のクエリは最新の結果を返します。クエリでマテリアライズドビューが明示的に参照されている場合、Amazon Redshift はマテリアライズドビュー内に現在保存されているデータにアクセスします。このデータには、マテリアライズドビューのベーステーブルからの最新の変更が、反映されていない場合があります。

クラスターバージョン 1.0.20949 以降で作成されたマテリアライズドビューの自動クエリ書き換えを使用できます。

セッションレベルでの自動クエリ書き換えを停止する場合は、SET mv\_enable\_aqmv\_for\_session を FALSE に使用します。

## マテリアライズドビューの自動クエリ書き換えの仕組み
<a name="mv_auto-rewrite_behavior"></a>

内部最適化に基づいて、Amazon Redshift はマテリアライズドビューの自動クエリ書き換えを透過的に呼び出し、最適なクエリ実行を可能な限り短いクエリ時間で提供することを決定する場合があります。

例えば、ユーザー A がクエリ `SELECT * FROM T1` を使用してテーブル T1 にマテリアライズドビュー M1 を作成するとします。ユーザー A には T1 に対する完全な SELECT 権限があります。ユーザー A は、ユーザー B を含むすべてのユーザーに M1 へのアクセスを許可します。ただし、ユーザー B が T1 を直接クエリしようとすると、アクセスは拒否されます。ユーザー B には T1 に対する SELECT 権限がないためです。

しばらくして、ユーザー B が再度 T1 のクエリを試みると、今回は T1 から結果が返されます。これは、マテリアライズドビューを使用した自動クエリ書き換えにより、テーブル T1 (`SELECT <cols> FROM T1`) に対するユーザー B のクエリがマテリアライズドビュー M1 (`SELECT <cols> FROM M1`) に対するクエリに書き換えられたためです。

## 制限事項
<a name="mv_auto-rewrite_limitations"></a>

マテリアライズドビューでの、自動クエリ書き換えの使用に関する制限事項は次のとおりです。
+ 自動クエリ書き換えは、以下のいずれかを参照しない、または含まないマテリアライズドビューで動作します。
  + サブクエリ
  + 左、右、またはフル外部結合
  + セットオペレーション 
  + SUM、COUNT、MIN、MAX および AVG 以外の集計関数。(これらは、自動クエリ書き換えで動作する唯一の集計関数です。)
  + DISTINCT を使用する集計関数
  + Window 関数
  + SELECT DISTINCT または HAVING 句
  + 外部テーブルまたは共有テーブル
  + その他のマテリアライズドビュー
+ 自動クエリ書き換えにより、ユーザー定義の Amazon Redshift テーブルを参照する SELECT クエリが書き換えられます。Amazon Redshift では、次のクエリは書き換えられません。
  + CREATE TABLE AS ステートメント
  + SELECT INTO ステートメント
  + カタログまたはシステムテーブルに対するクエリ
  + 外部結合または SELECT DISTINCT 句を使用したクエリ
+ クエリが自動的に書き換えられない場合は、指定したマテリアライズドビューに対する SELECT 許可があり、[mv\_enable\_aqmv\_for\_session](r_mv_enable_aqmv_for_session.md) オプションが TRUE に設定されているかどうかを確認します。

  STV\_MV\_INFO を調べることで、マテリアライズドビューがクエリの自動書き換えに適しているかどうかを確認することもできます。詳細については、「[STV\_MV\_INFO](r_STV_MV_INFO.md)」を参照してください。