クエリ オプティマイザーの概要

このページでは、Spanner のクエリ オプティマイザーとそのメリットについて説明します。

概要

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

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

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

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

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

さらに、Spanner では、クエリに行指向型または列指向型の処理方法を使用するかどうかを自動的に決定することで、クエリの実行を最適化します。詳しくは、スキャンを最適化するをご覧ください。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Spanner の統計情報パッケージは、作成から 30 日間保持された後、ガベージ コレクションの対象となります。

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

データベース全体を、その表に表示されているパッケージのいずれかに固定できます。固定された統計情報パッケージはガベージ コレクションされず、データベースがこのパッケージに固定されている限り、ALLOW_GC の値は無視されます。個々のクエリに特定の統計情報パッケージを使用するには、パッケージを ALLOW_GC=FALSE で一覧表示するか、固定する必要があります。これにより、統計情報パッケージがガベージ コレクションされた後にクエリが失敗するのを防ぐことができます。ALLOW_GC の値は、Google SQL の ALTER STATISTICS または PostgreSQL の ALTER STATISTICS DDL ステートメントを使用して変更できます。

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

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

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

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

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

次のステップ