ウェアハウスキャッシュの最適化¶
このトピックでは、ウェアハウスの所有者または管理者がウェアハウスのキャッシュを最適化して、ウェアハウスで実行されているクエリのパフォーマンスを向上させる方法について説明します。
稼働中のウェアハウスは、同じウェアハウスで実行されているクエリからアクセスできるテーブルデータのキャッシュを維持します。テーブルからではなくキャッシュから読み取ることができる場合は、これにより後続のクエリのパフォーマンスが向上する可能性があります。
特定のクエリの結果がキャッシュされ、再利用される方法を説明している 保存済みのクエリ結果の使用 もご参照ください。
注釈
このトピックで提供されている診断クエリを実行するには、 共有 SNOWFLAKE データベースへのアクセス が必要です。デフォルトでは、 ACCOUNTADMIN ロールのみがクエリを実行するために必要な権限を持っています。
キャッシュからスキャンされたデータの検索¶
次のクエリは、キャッシュからスキャンされ、すべてのクエリで集計され、ウェアハウスごとに分割されたデータの割合を提供します。
キャッシュからデータをスキャンするとメリットが得られるクエリ(例: 頻繁な類似クエリ)があり、キャッシュからスキャンされるデータの割合が低い場合は、キャッシュを最適化することでパフォーマンスが向上する可能性があります。
SELECT warehouse_name
,COUNT(*) AS query_count
,SUM(bytes_scanned) AS bytes_scanned
,SUM(bytes_scanned*percentage_scanned_from_cache) AS bytes_scanned_from_cache
,SUM(bytes_scanned*percentage_scanned_from_cache) / SUM(bytes_scanned) AS percent_scanned_from_cache
FROM snowflake.account_usage.query_history
WHERE start_time >= dateadd(month,-1,current_timestamp())
AND bytes_scanned > 0
GROUP BY 1
ORDER BY 5;
キャッシュと自動中断について¶
ウェアハウスが中断されるとキャッシュがドロップされるため、ウェアハウスの自動中断設定は、クエリのパフォーマンスに直接影響を与える可能性があります。ウェアハウスが頻繁に類似クエリを実行している場合は、次のクエリが実行される前にキャッシュがドロップされる可能性があるため、クエリ間でウェアハウスを一時中断することは無意味な場合があります。
自動一時中断の時間制限を設定するときは、次の一般的なガイドラインを使用できます。
タスク の場合、Snowflakeは即時中断を推奨します。
DevOps、 DataOps、およびデータサイエンスのユースケースの場合、Snowflakeは自動中断を約5分に設定することを推奨しています。これは、アドホックおよび一意のクエリではキャッシュがそれほど重要ではないためです。
BI および SELECT ユースケースなどのクエリウェアハウスの場合、Snowflakeは、ユーザーのキャッシュを維持するために、自動中断を少なくとも10分に設定することを推奨します。
コストの考慮事項¶
稼働中のウェアハウスは、クエリを処理していない場合でもクレジットを消費することに注意してください。自動中断の設定がワークロードと一致していることを確認してください。たとえば、ウェアハウスが30分ごとにクエリを実行する場合は、自動中断設定を10分に設定しても意味がありません。キャッシュは次のクエリが実行される前にドロップされるため、ウェアハウスはキャッシュのメリットを受けることなく、アイドル状態にある間にクレジットを消費します。
自動中断の構成方法¶
ウェアハウスが中断されてキャッシュがドロップされるまでの経過時間を変更するには、
- Snowsight:
Snowsight にサインインします。
Admin » Warehouses に移動します。
ウェアハウスを見つけて、 . . . » Edit を選択します。
Auto Suspend がオンになっていることを確認します。
Suspend After (min) フィールドに、ウェアハウスが中断されるまでの経過時間を分単位で入力します。
Save Warehouse を選択します。
- SQL:
ALTER WAREHOUSE コマンドを使用して、分単位ではなく秒単位で指定された自動中断の時間制限を変更します。例:
ALTER WAREHOUSE my_wh SET AUTO_SUSPEND = 600;