結果セットのキャッシュが有効になっている場合、専用 SQL プールはクエリ結果を繰り返し使用するためにユーザー データベースに自動的にキャッシュします。 これにより、後続のクエリ実行で永続化されたキャッシュから直接結果を取得できるため、再計算は必要ありません。 結果セットのキャッシュにより、クエリのパフォーマンスが向上し、コンピューティング リソースの使用量が削減されます。 さらに、キャッシュされた結果セットを使用するクエリではコンカレンシー スロットが使用されないため、既存のコンカレンシー制限に対してカウントされません。 セキュリティのために、ユーザーはキャッシュされた結果を作成するユーザーと同じデータ アクセス許可を持っている場合にのみ、キャッシュされた結果にアクセスできます。 結果セットのキャッシュは、データベース レベルとセッション レベルで既定で OFF になっています。
注
結果セットのキャッシュは、DECRYPTBYKEY と組み合わせて使用しないでください。 この暗号関数を使う必要がある場合は、実行時に結果セットのキャッシュを (セッションレベル、データベースレベルのいずれかで) 無効にするようにしてください。
キー コマンド
ユーザー データベースの結果セットのキャッシュをオン/オフにする
キャッシュされていないもの
データベースに対して結果セットのキャッシュが有効になると、次のクエリを除き、キャッシュがいっぱいになるまで、すべてのクエリに対して結果がキャッシュされます。
- ベース テーブルのデータまたはクエリに変更がない場合でも非決定的な組み込み関数またはランタイム式を含むクエリ。 たとえば、DateTime.Now()、GetDate() などです。
- ユーザー定義関数を使用したクエリ
- 行レベルのセキュリティを持つテーブルを使用したクエリ
- 行サイズが 64 KB を超えるデータを返すクエリ
- サイズの大きいデータを返すクエリ (>10 GB)
注
- 一部の非決定論的関数とランタイム式は、同じデータに対して繰り返しクエリを実行する際に決定論的になる可能性があります。 たとえば、ROW_NUMBER() などです。
- クエリ結果セット内の行の順序/シーケンスがアプリケーション ロジックにとって重要な場合は、クエリで ORDER BY を使用します。
- ORDER BY 列のデータが一意でない場合、結果セットのキャッシュが有効か無効かに関係なく、ORDER BY 列で同じ値を持つ行の行順序は保証されません。
Important
結果セット キャッシュを作成し、キャッシュからデータを取得する操作は、専用 SQL プール インスタンスの制御ノードで行われます。 結果セットのキャッシュが有効になっている場合、大きな結果セット (たとえば、 >1 GB) を返すクエリを実行すると、制御ノードで高い調整が発生し、インスタンスの全体的なクエリ応答が遅くなる可能性があります。 これらのクエリは、通常、データの探索または ETL 操作で使用されます。 制御ノードに負荷を与え、パフォーマンスの問題が発生するのを防ぐため、ユーザーは、このようなクエリを実行する前に、データベースの結果セットのキャッシュを無効にする必要があります。
クエリの結果セットのキャッシュ操作にかかった時間に対して、次のクエリを実行します。
SELECT step_index, operation_type, location_type, status, total_elapsed_time, command
FROM sys.dm_pdw_request_steps
WHERE request_id = <'request_id'>;
結果セットのキャッシュを無効にして実行されるクエリの出力例を次に示します。
結果セットのキャッシュを有効にして実行されるクエリの出力例を次に示します。
キャッシュされた結果が使用される場合
キャッシュされた結果セットは、次の要件がすべて満たされている場合、クエリに再利用されます。
- クエリを実行しているユーザーは、クエリで参照されているすべてのテーブルにアクセスできます。
- 新しいクエリと、結果セット キャッシュを生成した前のクエリの間に完全に一致します。
- キャッシュされた結果セットが生成されたテーブルにデータやスキーマの変更はありません。
このコマンドを実行して、結果キャッシュヒットまたはミスでクエリが実行されたかどうかを確認します。 result_cache_hit列は、キャッシュ ヒットの場合は 1、キャッシュ ミスの場合は 0、結果セットのキャッシュが使用されなかった理由から負の値を返します。 詳細は sys.dm_pdw_exec_requests を確認してください。
SELECT request_id, command, result_cache_hit FROM sys.dm_pdw_exec_requests
WHERE request_id = <'Your_Query_Request_ID'>
キャッシュされた結果を管理する
結果セット キャッシュの最大サイズは、データベースあたり 1 TB です。 基になるクエリ データが変更されると、キャッシュされた結果は自動的に無効になります。
キャッシュの削除は、このスケジュールに従って専用 SQL プールによって自動的に管理されます。
- 結果セットが使用されていないか、無効になっている場合は、48 時間ごと。
- 結果セットキャッシュが最大サイズに近づくとき。
ユーザーは、次のいずれかのオプションを使用して、結果セットキャッシュ全体を手動で空にすることができます。
- データベースの結果セット キャッシュ機能をオフにする
- データベースへの接続中に DBCC DROPRESULTSETCACHE を実行する
データベースを一時停止しても、キャッシュされた結果セットは空になりません。
次のステップ
開発についてのその他のヒントは、開発の概要に関するページをご覧ください。