クエリ オプティマイザーについて

コレクションでコンテンツを整理 必要に応じて、コンテンツの保存と分類を行います。

クエリ オプティマイザーとは

Cloud Spanner SQL クエリ オプティマイザーは、クエリで必要とされるデータを記述する宣言 SQL ステートメントを、そのデータを正確に取得する方法を記述する命令型実行プランに変換します。宣言文をクエリ実行プランに変換するプロセスには、クエリを表すために使用されるツリー構造への変換の実行が含まれます。オプティマイザーでは、実行プランを作成するプロセスで、正しい行が返されるように元の SQL クエリの論理的な意味を維持します。

オプティマイザーのもう 1 つの重要な役割は、効率的な実行プランを作成することです。

Spanner オプティマイザーではどのように効率的な実行プランを作成しますか?

Spanner のオプティマイザーは確立されたヒューリスティクスとコストベースの最適化を組み合わせて、効率的なプランを作成します。「ローカルマシンにデータを pull するのではなく、リモートマシンでフィルタを実行する」のように、一部のヒューリスティクスは非常に単純です。他のヒューリスティクスはより複雑ですが、データ量をデータに近づける移動ロジックの原則を体現しています。この原則は、複数のマシンにデータをシャーディングするシステムで特に重要です。

このような固定ルールを使用してすべての実行決定を効率的に行うことはできないため、Spanner のオプティマイザーでは代替の推定コストに基づいて決定されます。このようなコストの見積もりは、クエリの構造、データベースのスキーマ、クエリのフラグメントによって生成されるデータ容量の見積もりを使用して計算されます。たとえば、Spanner は、Songs テーブルのフィルタがクエリに含まれる場合、このフィルタが SongGenre = "Country" フィルタに該当する行数を見積もります。このような見積もりを計算するために、Spanner では統計が定期的に収集され、データベース内のデータの分布の特徴が示されます。

クエリ実行プランの詳細と、Cloud Spanner でそれを使用して分散環境でクエリを実行する方法については、クエリ実行プランをご覧ください。

クエリ オプティマイザーのバージョニング

時間の経過とともに Cloud Spanner クエリ オプティマイザが進化し、クエリ実行プランでの選択範囲が広がり、その選択に役立つ予測の精度が向上し、クエリ実行プランの効率が向上します。

Spanner では、クエリ実行プランの効率を高めるために、新しいクエリ オプティマイザー バージョンとしてオプティマイザーの更新をリリースします。さまざまなバージョンの詳細については、Cloud Spanner クエリ オプティマイザーのバージョンをご覧ください。

クエリ オプティマイザーの統計情報パッケージ

Spanner は、テーブル列のデータ分布に関する統計情報を保持し、クエリによって生成される行数を見積もるのに役立ちます。クエリ オプティマイザーは、これらの推定値を使用して最適なクエリ実行プランを選択します。これらの統計情報は、Spanner によって定期的に更新されます。統計情報はクエリ実行プランの選択に使用されるため、統計情報が更新されると、Spanner はクエリに使用するクエリプランを変更できるようになります。

デフォルトでは、データベースは生成された最新の統計情報パッケージを自動的に使用します。以前の統計情報パッケージのバージョンにデータベースを固定できます。最新以外の統計情報パッケージを使用して、個別のクエリを実行することもできます。

新しい統計情報パッケージを作成する

Spanner は 3 日ごとに新しい統計情報パッケージを自動的に生成します。新しい統計情報パッケージを手動で作成するには、ANALYZE DDL ステートメントを使用します。

新しい統計パッケージを作成すると、次のようなデータベースのデータまたはスキーマを大幅に変更した後、クエリのパフォーマンスが向上する可能性があります。

  • データベースが大量の挿入、更新、削除を処理する。
  • データベースに新しいインデックスを追加します。
  • テーブルに新しい列を追加します。

ANALYZE DDL ステートメントを実行すると、スキーマが更新され長時間実行オペレーションが開始されます。

Spanner がステートメントの実行を終了した後、クエリ オプティマイザーがクエリプランの新しい統計パッケージを考慮するまでに最大 10 分かかります。

統計パッケージのガベージ コレクション

Spanner の統計情報パッケージは、作成から 30 日間保持されます。その後、ガベージ コレクションが行われます。

Spanner の組み込みの INFORMATION_SCHEMA.SPANNER_STATISTICS テーブルには、使用可能な統計パッケージのリストが含まれています。この表の各行には、統計情報パッケージが名前ごとに一覧表示され、名前には特定のパッケージの作成タイムスタンプが含まれます。各エントリには、パッケージをガベージ コレクションできるかどうかを定義する ALLOW_GC というフィールドも含まれています。

データベース全体を、そのテーブルに記載されているパッケージのいずれかに固定できます。固定された統計情報パッケージは、ガベージ コレクションの対象になりません。ALLOW_GC の値は、データベースがこのパッケージに固定されている限り無視されます。個々のクエリに特定の統計情報パッケージを使用するには、パッケージを ALLOW_GC=FALSE と一緒に指定するか、固定する必要があります。これにより、統計情報パッケージが収集された後にクエリが失敗することを回避できます。ALLOW_GC の値は、ALTER STATISTICS DDL ステートメントを使用して変更できます。

パッケージの保持と個人を特定できる情報(PII)

統計情報パッケージには、標準的な業界の慣例に従って列データのヒストグラムが含まれます。これにより、クエリ オプティマイザーは最適なクエリプランを選択できます。ヒストグラムは、小さな値のサンプルを使用して作成されます。この小さなデータセットには、個人を特定できる情報(PII)が含まれている可能性があります。

Spanner は新しい統計情報パッケージを定期的に作成し、デフォルトで 30 日間保持します。このため、データベースから削除された値の小さなサンプルは、統計ヒストグラムでさらに 30 日間保持できます。optimizer_statistics_package データベース オプションに固定された統計パッケージ、または ALLOW_GC=FALSE オプションを持つパッケージは、ガベージ コレクションの対象になりません。これらのパッケージのヒストグラムには、より長い期間データベースから削除された値が含まれる場合があります。また、統計パッケージの内容はデータベースのバックアップに含まれています。

オプティマイザーの統計情報は、ユーザーデータと同じ方法で暗号化されて保存されます。

通常、これらのパッケージに必要なストレージの合計容量は 100 MB 未満で、合計ストレージ費用にカウントされます。

次のステップ