

 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="query-performance-improvement-opportunities"></a>

Amazon Redshift のクエリパフォーマンスに影響を与える一般的な問題と、それらの問題を診断して解決する手順を以下に示します。

**Topics**
+ [テーブル統計がないか古い](#table-statistics-missing-or-out-of-date)
+ [Nested Loop](#nested-loop)
+ [ハッシュ結合](#hash-join)
+ [非実体行または未コミット行](#ghost-rows-or-uncommitted-rows)
+ [未ソート行または正しくソートされていない行](#unsorted-or-mis-sorted-rows)
+ [十分最適でないデータ分散](#suboptimal-data-distribution)
+ [クエリに割り当てられてメモリが不十分](#insufficient-memory-allocated-to-the-query)
+ [十分最適でない WHERE 句](#suboptimal-WHERE-clause)
+ [述語の制限が不十分](#insufficiently-restrictive-predicate)
+ [非常に大きな結果セット](#very-large-result-set)
+ [大きい SELECT リスト](#large-SELECT-list)

## テーブル統計がないか古い
<a name="table-statistics-missing-or-out-of-date"></a>

テーブル統計がないか古い場合、次の状況が発生することがあります。
+ EXPLAIN コマンドの結果として警告メッセージが表示される。
+ STL\$1ALERT\$1EVENT\$1LOG に統計がないことを示すアラートイベントが記録される。詳細については、「[クエリアラートの確認](c-reviewing-query-alerts.md)」を参照してください。

この問題を修正するには、[ANALYZE](r_ANALYZE.md)を実行します。

## Nested Loop
<a name="nested-loop"></a>

ネステッドループがある場合、STL\$1ALERT\$1EVENT\$1LOG にネステッドループのアラートイベントが記録されることがあります。[ネステッドループにあるクエリの特定](identify-queries-with-nested-loops.md) でクエリを実行することで、このイベントタイプを識別することもできます。詳細については、「[クエリアラートの確認](c-reviewing-query-alerts.md)」を参照してください。

この問題を修正するには、クエリでクロス結合を確認し、可能であれば削除します。クロス結合は、2 つのテーブルのデカルト積を算出する結合条件のない結合です。これらは通常、可能な結合タイプの中で最も遅いネステッドループ結合として実行されます。

## ハッシュ結合
<a name="hash-join"></a>

ハッシュ結合が存在する場合、次の状況が発生する可能性があります。
+ クエリプランにハッシュおよびハッシュ結合操作がある。詳細については、「[クエリプランの分析](c-analyzing-the-query-plan.md)」を参照してください。
+ SVL\$1QUERY\$1SUMMARY の maxtime 値が最も大きいセグメントに HJOIN ステップがある。詳細については、「[SVL\$1QUERY\$1SUMMARY ビューの使用](using-SVL-Query-Summary.md)」を参照してください。

この問題を修正するには、いくつかの方法を実行することができます。
+ 可能であれば、マージ結合を使用するようにクエリを書き換えます。これは、分散キーおよびソートキーの両方である結合列を指定することで行うことができます。
+ SVL\$1QUERY\$1SUMMARY 内の HJOIN ステップにある行の値が、クエリ内の最後の RETURN ステップにある行と比較して非常に大きい場合、クエリを書き換えて一意の列で結合することができるかどうかを確認します。クエリが一意の列 (プライマリキーなど) で結合されない場合、結合に関係する行数が増加します。

## 非実体行または未コミット行
<a name="ghost-rows-or-uncommitted-rows"></a>

非実体行または未コミット行が存在する場合、非実体行が多すぎることを示すアラートイベントが STL\$1ALERT\$1EVENT\$1LOG に記録されることがあります。詳細については、「[クエリアラートの確認](c-reviewing-query-alerts.md)」を参照してください。

この問題を修正するには、いくつかの方法を実行することができます。
+ クエリテーブルのアクティブなロードオペレーションについては、Amazon Redshift コンソールの [**Loads (ロード)**] タブを確認してください。アクティブなロード操作がある場合、アクションを実行する前にそれらの操作が完了するまで待ちます。
+ アクティブなロード操作がない場合、クエリテーブルで [VACUUM](r_VACUUM_command.md) を実行して、削除済みの行を除去します。

## 未ソート行または正しくソートされていない行
<a name="unsorted-or-mis-sorted-rows"></a>

未ソート行または正しくソートされていない行が存在する場合、STL\$1ALERT\$1EVENT\$1LOG にかなり限定的なアラートイベントが記録されることがあります。詳細については、「[クエリアラートの確認](c-reviewing-query-alerts.md)」を参照してください。

[データスキューまたは未ソート行のあるテーブルの特定](identify-tables-with-data-skew-or-unsorted-rows.md) でクエリを実行することにより、クエリ内のいずれかのテーブルに未ソート領域が大量にあるかどうかを確認することもできます。

この問題を修正するには、いくつかの方法を実行することができます。
+ クエリテーブルで [VACUUM](r_VACUUM_command.md) を実行し、行を再ソートします。
+ クエリテーブルでソートキーを確認し、改善できる点がないかどうかを調べます。変更を加える前に、必ずこのクエリのパフォーマンスと他の重要なクエリやシステム全体のパフォーマンスを比較検討してください。詳細については、「[ソートキー](t_Sorting_data.md)」を参照してください。

## 十分最適でないデータ分散
<a name="suboptimal-data-distribution"></a>

データ分散が十分に最適でない場合、次の状況が発生する可能性があります。
+ 直列実行、大量のブロードキャスト、または大量の分散に関するアラートイベントが STL\$1ALERT\$1EVENT\$1LOG に記録される。詳細については、「[クエリアラートの確認](c-reviewing-query-alerts.md)」を参照してください。
+ 各スライスがあるステップについて処理している行の数が大きく異なる。詳細については、「[SVL\$1QUERY\$1REPORT ビューの使用](using-SVL-Query-Report.md)」を参照してください。
+ 各スライスがあるステップにかけている時間が大きく異なる。詳細については、「[SVL\$1QUERY\$1REPORT ビューの使用](using-SVL-Query-Report.md)」を参照してください。

上記のどれもあてはまらない場合、[データスキューまたは未ソート行のあるテーブルの特定](identify-tables-with-data-skew-or-unsorted-rows.md)でクエリを実行することにより、クエリ内のいずれかのテーブルにデータスキューがないかどうかを確認することもできます。

この問題を修正するには、クエリ内のテーブルの分散スタイルを確認して、改善できる点がないかを調べます。変更を加える前に、必ずこのクエリのパフォーマンスと他の重要なクエリやシステム全体のパフォーマンスを比較検討してください。詳細については、「[クエリ最適化のためのデータのディストリビューション](t_Distributing_data.md)」を参照してください。

## クエリに割り当てられてメモリが不十分
<a name="insufficient-memory-allocated-to-the-query"></a>

クエリに割り当てられたメモリが不十分な場合、`is_diskbased`値が true のステップが SVL\$1QUERY\$1SUMMARY に存在する可能性があります。詳細については、「[SVL\$1QUERY\$1SUMMARY ビューの使用](using-SVL-Query-Summary.md)」を参照してください。

この問題を修正するには、クエリが使用するクエリスロットの数を一時的に増やして、クエリに多くのメモリを割り当てます。ワークロード管理 (WLM) は、キューに設定された同時実行レベルと同等のスロットをクエリキューに確保します。例えば、同時実行レベルが 5 のキューには 5 つのスロットがあります。キューに割り当てられたメモリは、各スロットに均等に割り当てられます。1 つのクエリに複数のスロットを割り当てると、そのクエリはすべてのスロットのメモリにアクセスできます。クエリのスロットを一時的に増やす方法の詳細については、「[wlm\$1query\$1slot\$1count](r_wlm_query_slot_count.md)」を参照してください。

## 十分最適でない WHERE 句
<a name="suboptimal-WHERE-clause"></a>

WHERE 句により実行されるテーブルスキャンが多すぎる場合、SCAN ステップのセグメントの SVL\$1QUERY\$1SUMMARY 内の `maxtime` 値が最も大きくなる可能性があります。詳細については、「[SVL\$1QUERY\$1SUMMARY ビューの使用](using-SVL-Query-Summary.md)」を参照してください。

この問題を修正するには、最も大きいテーブルのプライマリソート列に基づいて WHERE 句をクエリに追加します。この方法により、スキャン時間を最小限に抑えることができます。詳細については、「[Amazon Redshift テーブル設計のベストプラクティス](c_designing-tables-best-practices.md)」を参照してください。

## 述語の制限が不十分
<a name="insufficiently-restrictive-predicate"></a>

制限が不十分な述語がクエリにある場合、SVL\$1QUERY\$1SUMMARY にある `maxtime` 値が最も大きいセグメントの SCAN ステップの `rows` 値が、クエリ内の最後の RETURN ステップにある `rows` 値と比較してかなり大きくなることがあります。詳細については、「[SVL\$1QUERY\$1SUMMARY ビューの使用](using-SVL-Query-Summary.md)」を参照してください。

この問題を修正するには、クエリに述語を追加するか、既存の述語の制限を強めて出力を絞り込んでみてください。

## 非常に大きな結果セット
<a name="very-large-result-set"></a>

クエリにより非常に大きな結果セットが返される場合、[UNLOAD](r_UNLOAD.md)を使用して Amazon S3 に結果が書き込まれるようにクエリを書き換えることを検討してください。この方法を実行すると、並列処理を活用することで RETURN ステップのパフォーマンスが向上します。非常に大きな結果セットを確認する方法の詳細については、「[SVL\$1QUERY\$1SUMMARY ビューの使用](using-SVL-Query-Summary.md)」を参照してください。

## 大きい SELECT リスト
<a name="large-SELECT-list"></a>

クエリに非常に大きい SELECT リストがある場合、SVL\$1QUERY\$1SUMMARY 内のいずれかのステップの `bytes` 値が `rows` 値より大きくなる (他のステップと比較して) ことがあります。`bytes` 値が大きいことは、多くの列を選択していることを示す場合があります。詳細については、「[SVL\$1QUERY\$1SUMMARY ビューの使用](using-SVL-Query-Summary.md)」を参照してください。

この問題を修正するには、選択している列を確認し、削除ができるかどうかを調べます。