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

このページでは、Spanner クエリ オプティマイザーとそのメリットについて説明します。クエリ オプティマイザーは、GoogleSQL 言語データベースと PostgreSQL 言語データベースで使用できます。

概要

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

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

Spanner オプティマイザーが効率的に実行プランを作成する仕組み

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

このような固定ルールではすべての実行決定を効率的に行うことはできないため、Spanner オプティマイザーは代替の推定コストに基づいて決定を行います。このようなコストの見積もりは、クエリの構造、データベースのスキーマ、クエリのフラグメントによって生成されるデータ容量の見積もりを使用して計算されます。たとえば、SongGenre = "Country" というフィルタがクエリに含まれる場合、Spanner は、このフィルタの対象となる 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 未満で、ストレージの総費用にカウントされます。

次のステップ