クエリ オプティマイザー

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

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

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

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

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

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

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

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

クエリ オプティマイザーは時間の経過とともに進化し、コストベースのクエリ実行プランの選択肢が広がり、そのような選択肢を伝える見積もりの精度が向上し、クエリ実行プランの効率が向上します。

Cloud Spanner では、オプティマイザーの更新が新しいクエリ オプティマイザー バージョンとしてロールアウトされます。デフォルトでは、各データベースで常に最新バージョンのオプティマイザーを使用します。クエリで使用するクエリ オプティマイザーのバージョンを管理できるようになりました。 最新バージョンに commit する前に、古いバージョンと最新バージョンのクエリ パフォーマンス プロファイルを比較できます。詳細については、クエリ オプティマイザーを管理するをご覧ください。

クエリ オプティマイザーの変更履歴

以下は、各リリースでのクエリ オプティマイザーの更新の概要です。

バージョン 2: 2020 年 3 月 1 日(最新)

  • インデックスの選択の最適化が追加されました。
  • 特定の状況で REGEXP_CONTAINSLIKE の述語のパフォーマンスが向上します。
  • 特定の状況で GROUP BY でのスキャンのパフォーマンスが向上します。

バージョン 1: 2019 年 6 月 18 日

  • 述語のプッシュダウン、制限のプッシュダウン、冗長結合、冗長な式の削除など、ルールベースの多数の最適化が含まれています。

  • ユーザー データの統計を使用して、各テーブルへのアクセスに使用するインデックスを選択します。

シナリオ用のオプティマイザーのバージョンを管理するには、クエリ オプティマイザーを管理するをご覧ください。