Amazon Redshift Spectrum クエリの料金を計算する方法を教えてください。
Amazon Redshift Spectrum を使用して Amazon Simple Storage Service (Amazon S3) データをクエリする際のコストを計算し、最適化したいです。
簡単な説明
前提条件
- 同じ AWS リージョンに配置された Amazon Redshift クラスターと S3 バケット。
- SQL コマンドを実行するための、クラスターに接続された SQL クライアント。
Redshift Spectrum が Amazon S3 からスキャンしたバイト数に対して料金が発生します。リージョンに応じて、追加料金が発生する場合があります。Redshift Spectrum は、バイト数をメガバイト単位で切り上げます。クエリごとの最小サイズは 10 MB です。詳細については、「Amazon Redshift の料金」を参照してください。
注: Redshift Spectrum では、パーティションや失敗したクエリを管理するために使用するデータ定義言語 (DDL) には料金が発生しません (CREATE、ALTER、DROP TABLE)。Amazon Redshift Serverless のコンピューティングキャパシティー料金には、すべての Amazon S3 外部データクエリが含まれます。
解決策
推定クエリコストを計算し、Redshift Spectrum で実行するすべての S3 クエリに関する概要を取得するには、SVL_S3QUERY_SUMMARY テーブルを使用します。s3_scanned_bytes 列は、Redshift Spectrum が S3 からスキャンし、Redshift Spectrum レイヤーに送信したバイト数を返します。
使い方
SVL_S3QUERY_SUMMARY に次のクエリを実行すると、queryID ごとに Amazon S3 が転送するバイト数を取得できます。
SELECT s3_scanned_bytes FROM SVL_S3QUERY_SUMMARY WHERE query=queryID;
注: queryID は、実際のクエリ ID に置き換えます。
S3 からスキャンされたすべてのバイト数の合計を確認するには、次のクエリを実行します。
SELECT sum(s3_scanned_bytes) FROM SVL_S3QUERY_SUMMARY;
特定の時間間隔で実行したすべての Redshift Spectrum クエリのバイト数の合計を求めることもできます。次の例は、前日から実行を開始したクエリの合計バイト数を計算する方法を示しています。
SELECT sum(s3_scanned_bytes) FROM SVL_S3QUERY_SUMMARY WHERE starttime >= current_date-1;
米国東部 (バージニア北部) リージョンの S3 バケットに対して次のクエリを実行すると、Redshift Spectrum にテラバイト単位の料金が発生します。SVL_S3QUERY_SUMMARY をクエリし、返された s3_scanned_bytes の合計が 621,900,000,000 バイトの場合、バイトをテラバイト換算すると 0.565614755032584 になります。
クエリ例
621900000000 bytes = 621900000000/1024 = 607324218.75 kilobytes 607324218.75 kilobytes = 607324218.75/1024 = 593090.057373046875 megabytes 593090.057373046875 megabytes = 593090.057373046875 /1024 = 579.189509153366089 gigabytes 579.189509153366089 gigabytes = 579.189509153366089/1024 = 0.565614755032584 terabytes
次の例では、使用量は約 0.5657 テラバイトです。Redshift Spectrum の使用コストを計算するには、テラバイトあたりのコストを乗算します。
$5 * 0.5657= $2.83
次の SQL クエリを実行して Redshift Spectrum の使用料金を計算します。
SELECT round(1.0*sum(s3_scanned_bytes/1024/1024/1024/1024),4) s3_scanned_tb, round(1.0*5*sum(s3_scanned_bytes/1024/1024/1024/1024),2) cost_in_usd FROM SVL_S3QUERY_SUMMARY;
上記の例では、クエリが前日から S3 バケットに対するスキャンを開始したデータに関する Redshift Spectrum の料金をクエリします。
**注:**9.9 MB 以下をスキャンするクエリはすべて切り上げられ、10 MB の料金が発生します。クエリが失敗または停止した場合、料金は発生しません。
なお、システムログテーブル (STL) には、ログの使用状況と使用可能なディスク容量によっては、2 ~ 5 日のログ履歴しか保存されません。転送されたバイト数を記録するには、毎日のクエリ料金を計算し、そのデータを別のテーブルに保存することをおすすめします。
クエリ例
CREATE VIEW spectrum_cost AS SELECT starttime::date as date, xid, query, trim(usename) as user, CASE WHEN s3_scanned_bytes < 10000000 then 10 ELSE s3_scanned_bytes/1024/1024 end as scanned_mb, round(CASE WHEN s3_scanned_bytes < 10000000 then 10*(5.0/1024/1024) ELSE (s3_scanned_bytes/1024/1024)*(5.0/1024/1024) end,5) as cost_$ FROM svl_s3query_summary s LEFT JOIN pg_user u ON userid=u.usesysid JOIN (select xid as x_xid,max(aborted) as x_aborted from svl_qlog group by xid) q ON s.xid=q.x_xid WHERE userid>1 AND x_aborted=0 AND s.starttime >= current_date-1;
注: CREATE TABLE クエリを使用してデータを計算し、別のテーブルに保存することもできます。期間を指定しない場合は、current_date-1 を削除します。
クエリが、前日から S3 から Redshift Spectrum にスキャンしたデータの合計を計算します。合計料金の見積もりを計算するには、次のクエリを実行します。
SELECT current_date-1 as query_since, SUM(scanned_mb) as total_scanned_mb, SUM(cost_$) as total_cost_$ FROM spectrum_cost; Result: query_since | total_scanned_mb | total_cost_$ --------------+------------------+--------------- 2020-05-15 | 5029 | 0.02515
Redshift Spectrum のベストプラクティス
クエリ料金を削減して Redshift Spectrum のパフォーマンスを向上させるには、次のベストプラクティスを実施します。
- Redshift Spectrum のコスト管理と同時実行スケーリング機能を使用して使用状況を監視、管理します。
- 最適化されたデータ形式を使用すると、パフォーマンスが向上し、コストを削減できます。PARQUET や ORC などの列指向データ形式を使用すると、Amazon S3 からスキャン対象の列のみを選択できます。
- データへのアクセス頻度が低い場合は、Amazon S3 にデータをロードしてから Redshift Spectrum を使用します。
- 複数の Amazon Redshift クラスターを使用して同時実行をスケーリングする場合は、ジョブが完了した直後にそれらのクラスターを停止します。
Redshift Spectrum のコスト管理と同時実行スケーリング
Redshift Spectrum のコスト管理と同時実行スケーリング機能を使用する場合、日、週、月ごとの使用クォータを作成できます。使用クォータに達すると、Amazon Redshift が自動的にアクションを実行します。
コスト管理を設定するには、次の手順を実行します。
- Amazon Redshift コンソールを開きます。
- [使用制限の設定] を選択します。
- 次の構成設定を更新します。
期間
使用限度
アクション
注: [アクション] 設定を使用すると、使用クォータを管理しやすくなります。
同時実行スケーリングの使用クォータを設定するには、次の手順を実行します。
- Amazon Redshift コンソールを開きます。
- 使用クォータには、[同時実行スケーリングの使用制限] を選択します。
- 次の構成設定を更新します。
期間
使用限度
アクション
注: [期間] のタイムゾーンは UTC です。[アクション] 設定では、アラートと無効化機能に Amazon Simple Notification Service (Amazon SNS) サブスクリプションを追加することもできます。Amazon Redshift コンソールを使用してアラートを有効化すると、メトリクスに対する Amazon CloudWatch アラームが自動的に作成されます。
コスト管理に関するその他の要件と制限事項
Redshift Spectrum の使用状況とコストを管理するには、以下の要件と制限事項を確認してください。
- 使用量制限は、サポートされているバージョン 1.0.14677 以降で使用できます。
- 各カテゴリには最大 4 種類のクォータとアクションを追加できます。クォータの総数には 8 種類の制限があります。
- Redshift Spectrum は、Redshift Spectrum と自動実行スケーリングを使用できるリージョンのみでサポートされます。
- 各機能につき 1 つのクォータのみが、無効化機能を使用できます。
- 使用クォータは、その使用クォータの定義またはクラスターを削除するまで保持されます。
- 期間の途中でクォータを作成した場合、クォータはその時点から期間の終了時まで測定されます。
- ログオプションを選択する場合は、STL_USAGE_CONTROL ログで詳細を確認します。
