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

このページでは、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 でリストするか、固定する必要があります。これにより、統計情報パッケージがガベージ コレクションの対象にされた後にクエリが失敗するのを防ぐことができます。GoogleSQL の ALTER STATISTICS または PostgreSQL の ALTER STATISTICS の DDL ステートメントを使用して、ALLOW_GC の値を変更できます。

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

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

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

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

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

次のステップ