クエリー最適化とは何ですか?

クエリー最適化の定義

クエリー最適化は、データベースがクエリーを実行する最も効率的な方法を決定するプロセスです。

 

ユーザーがクエリー(通常は構造化クエリー言語(SQL)文として記述される)を送信すると、データベースは要求されたデータを取得するための複数の方法を評価します。この意思決定プロセスは、クエリー・オプティマイザーと呼ばれるコンポーネントによって処理され、最も効率的な実行戦略が選択されます。

最新のデータベース管理システム(DBMS)は、コストベースのオプティマイザーを使用して、さまざまな実行ストラテジーのコストを推定し、最も効率的なオプションを選択します。このプロセスのため、同一の成果を生成する2つのデータベース・クエリーの実行時間が大きく異なる可能性があり(多くの場合、ミリ秒単位)、クエリーの性能と応答時間に影響を及ぼします。

クエリー最適化が重要な理由

クエリー最適化、あるいはSQLクエリー最適化は、個々のクエリーの性能にはるかに大きな影響を与えます。システムを拡張してリソースを使用する方法を改善することで、データ・システム全体、機械学習モデル、人工知能(AI)イニシアチブの効率を決定します。

拡張性

アプリケーションは、情報を迅速かつ一貫性をもって取得するためにデータベースに依存しています。クエリーが非効率である場合、データベースはテーブル・スキャン、レコードの並べ替え、または大規模なデータセットの結合に不要な時間を費やす可能性があります。このような遅延は、アプリケーション・プログラミング・インターフェース(API)や分析ワークロードの速度を低下させ、全体的なユーザーエクスペリエンスを低下させるボトルネックを引き起こします。

組織がより多くのデータを収集するにつれて、データベースは、膨大な量、多様なデータ型、より要求の厳しいクエリー・パターンによって、ますます複雑化するワークロードをサポートする必要があります。

世界のデータスフィアは2028年までに393.9ゼタバイトに達すると予想されており、かつては数千行を処理していたクエリーも、最終的には数百万から数十億行を処理するようになるかもしれません。クエリー最適化により、データ量が増えてワークロードの複雑さが増大しても、効率的なクエリーが可能になるため、拡張性が向上します。

リソースの利用

効率的な実行計画により、問い合わせの処理に必要なリソースも削減されます。すべてのデータベースオペレーションは、中央処理装置(CPU)サイクルやディスクインプット/アウトプット(I/O)など、データを処理するためのシステム・リソースを必要とします。

最適化されていないクエリーはリソースを大量に消費し、同じ成果を生成するために必要以上の処理が必要になります。リソースの使用量が価格に直接影響するクラウド環境では、リソース消費量の増加は高コストになる可能性があります。

機械学習、リアルタイム分析検索拡張生成(RAG)、AIをサポートする最新のデータ・プラットフォームは、大量のデータへの高速かつ信頼性の高いアクセスに依存しています。クエリー最適化により、これらのシステムは予算を損なうことなく、リアルタイムの意思決定をサポートするのに十分な速さで関連情報を取得できるようになります。

AI Academy

生成AIの成功の鍵はデータ管理

生成AIの使用を成功させるために、高品質のデータが不可欠である理由をご覧ください。

クエリー最適化の主要コンポーネント

データベース・オプティマイザーは、潜在的な実行ストラテジーを評価する際に、いくつかのアプローチを使用できます。初期のデータベース・システムでは、あらかじめ定義されたルールを適用して、クエリー構造に基づいて実行計画を決定するルールベースの最適化がよく使用されていました。

最新のDBMSは通常、コストベースの最適化を優先し、複数の可能な実行戦略を評価し、それぞれに必要なリソースを見積もります。一部のシステムには、ヒューリスティック・ベースの手法も組み込まれており、実用的なガイドラインを適用して、クエリー計画を簡素化し、最適化オーバーヘッドを削減します。

最適化アプローチを使用するにせよ、オプティマイザーが潜在的な実行ストラテジーを評価する方法は、次の技術的概念によって形作られます。

  • クエリー・オプティマイザー
  • データベース統計
  • カーディナリティー推定
  • インデックスとアクセス・パス
  • 結合アルゴリズム

クエリー・オプティマイザー

クエリー・オプティマイザーは、効率的な実行計画を選択するデータベース・コンポーネントであり、多くの場合、コストベースの最適化手法を使用します。リレーショナル・データベースでは、このプロセスは、データベース・エンジンがSQLクエリーを実行する最も効率的な方法を決定するのに役立ちます。

コストベースのオプティマイザーは、固定されたルールに依存するのではなく、データの特性とクエリー構造を分析して、最も効率的なアプローチを決定します。この柔軟性により、データベースはデータセットやワークロードの進化に合わせて実行戦略を適応させることができます。

データベース統計

オプティマイザーは、さまざまな実行計画のコストを推定するために、データベース統計に大きく依存しています。統計は、次のような保管されたデータの主な特性を表します。

  • 各テーブルの行数
  • 列内の値の分布
  • インデックス列の選択性
  • テーブル間の関係
  • 各列のデータ型

これらの統計情報を基に、オプティマイザーはクエリーから返される行数と、異なる実行ストラテジーで必要な作業量を推定できます。統計が古くなったり不正確になったりすると、オプティマイザーは非効率的な実行計画を選択する可能性があります。

カーディナリティー推定

カーディナリティー推定とは、クエリーの各ステップから成果として得られる行数を予測することを指します。例えば、クエリーが次のようなWHERE句を使用して行をフィルタリングするとします。

WHERE region = ‘North America’

オプティマイザーは、そのフィルターに一致するレコードの数を推定する必要があります。

これらの推定は、いくつかの重要な意思決定に影響を与えます。オプティマイザーは、これらを使用して、テーブルを結合する順序、最も効率的な結合順序、使用する結合アルゴリズム、またはテーブル全体をスキャンする代わりにインデックス・スキャンを使用するかどうかを決定できます。

インデックスとアクセス・パス

インデックスを使用すると、データベースはテーブル全体をスキャンするよりも効率的に特定のデータを見つけることができます。オプティマイザーはインデックスを使用して、データ検索に必要な作業量を削減します。

一般的なアクセス・パスには、テーブル内のすべての行を読み取る完全なテーブル・スキャンがあります。インデックス・スキャン:インデックス構造を通じて行を読み取ります。インデックスシーク:インデックス・ルックアップを使用して特定の行を取得します。インデックスのみのスキャン:基礎となるテーブルにはアクセスせずにインデックスから直接データを取得します。

適切なアクセス・パスを選択すると、特に大きなテーブルを扱う場合に、クエリーの実行に必要な作業量を大幅に削減できます。

結合アルゴリズム

多くのクエリーは複数のテーブルからデータを取得します。この場合、オプティマイザーはこれらのテーブルをどのように組み合わせるかを決定する必要があります。一般的な結合アルゴリズムには、次のものがあります。

  • ネストループ結合:あるデータセットの行を別のデータセットの行と順次比較します。このアプローチは、1つのテーブルが比較的小さい場合や、インデックスによって内部結合の高速検索が可能である場合に適しています。

  • ハッシュ結合:あるデータセットからハッシュ・テーブルを作成し、それを使用して別のデータセットの行を効率的に照合します。このストラテジーは多くの場合、大規模なデータセットに適しています。

  • マージ結合:ソートされた2つのデータセットの行を同時にスキャンして結合します。

オプティマイザーは、データ・サイズ、使用可能なインデックス、推定された行数などの要素に基づいて、これらのアルゴリズムの中から選択を行います。

クエリー最適化の仕組み

クエリー最適化がどのように機能するかを理解するためには、SQLを宣言型言語と考察することが役に立ちます。つまり、データをどのように取得するかではなく、どのデータを取得する必要があるかを記述します。

オプティマイザーは、リクエストを最も効率的に実行する方法を決定する責任を負います。これを実現するために、ほとんどのデータベースはいくつかの最適化手順に従います。

  • 解析と検証
  • クエリーの書き換え
  • 実行計画の作成
  • プラン費用の見積もり
  • 実行計画の選択

解析と検証

クエリーが送信されると、データベースはまずSQLステートメントを解析し、その構文を検証します。この段階で、システムは参照されたテーブル、列、インデックスが存在し、クエリー構造が有効であることを確認します。

また、データベース・スキーマ内の関連オブジェクトが利用可能であることも検証します。このステップにより、リクエストを最適化または実行する前に、データベースがリクエストを確実に理解できるようになります。

クエリーの書き換え

解析後、データベースはクエリーをより効率的に実行できる同等の形式に書き直す場合があります。これらのトランスフォーメーションにより、クエリーの成果は維持されながら、実行構造が改善されます。一般的なクエリー書き換え手法には、次のようなものがあります。

  • 述語プッシュダウン:クエリーの実行の早い段階でフィルターを適用して、後で処理する必要のある行が少なくなります。

  • サブクエリーのフラット化:ネストされたクエリーを結合に変換し、多くの場合、より効率的に実行できるようにします。

  • 結合並べ替え:テーブルを結合する順序を変更して、中間の成果を減らす。

  • 冗長な操作の排除:不要な並べ替えや重複の削除など。

これらのトランスフォーメーションにより、オプティマイザーは最終的な成果を変更することなく、より効率的なストラテジーを探索します。また、不要なデータの処理を制限するのにも役立ちます。

実行計画の生成

クエリーが書き換えられると、オプティマイザーは複数の潜在的な実行計画を生成します。各プランは、要求されたデータを取得するための異なるストラテジーを表します。

計画は、使用されるインデックス、テーブルが結合される順序、または中間成果の処理方法によって異なる場合があります。比較的単純なクエリーでも、いくつかの可能な実行戦略を生み出すことができます。

例えば、過去1週間の注文を取得する1つのクエリーには、いくつかのオプションがあります。注文テーブルをスキャンしてその後行をフィルタリングしたり、注文日のインデックスを使用して最近のレコードをすばやく見つけたり、関連する顧客や製品に結合する前に最初にデータセットを絞り込んだりすることができます。

プラン費用の見積もり

次に、オプティマイザーは、コスト・モデルを使用して各候補プランを評価します。コスト・モデルは、特定の計画を実行するためにデータベースが実行する必要がある作業量を推定します。これらの推定値では通常、次のような要素が考慮されます。

  • CPU処理要件
  • データを取得するために必要なディスク入出力操作
  • ソートやハッシュなどのオペレーションによるメモリー消費量
  • 分散環境におけるネットワーク転送

データベースは正確なコストを事前に知ることができないため、データについて保管されている統計情報に依存しています。その情報は、オプティマイザーが可能性のある処理時間を推定し、どのアルゴリズムとサポートするデータ構造が最も適切であるかを判断するのに役立ちます。

実行計画の選択

候補プランを評価した後、オプティマイザーは推定コストが最も低いプランを選択します。この選択されたストラテジーが、データベースがクエリーを実行する際にオペレーションの順序を記述するクエリー実行計画になります。

効率的な実行計画には通常、テーブル・スキャン、結合、ソート、集計(GROUP BYやLEFT JOINを使用)などの操作が含まれます。ユーザーは、EXPLAINプランをレビューして、オプティマイザーが要求されたデータを取得するために実行する手順を確認できます。

クエリー最適化に伴う課題

最新のデータベース・オプティマイザーが高度であるにもかかわらず、いくつかの要因によってクエリー最適化が困難になっている可能性があります。

  • 不正確な統計:統計が古くなったり不完全になったりすると、オプティマイザーはデータ分布について誤った仮定を立てる可能性があります。これにより、必要以上の作業を行う非効率な実行計画につながる可能性があります。
  • データの歪み:データ分布が不均等であると、オプティマイザーがクエリーから返される行数を予測するのが困難になる場合があります。特定の値が他の値よりもはるかに頻繁に現れる場合、標準的な推定手法では予測が不正確になることがあります。
  • 複雑なクエリー:多数の結合、ネストされたオペレーション、またはサブクエリーを含むクエリーは、多数の潜在的な実行計画を生成する可能性があります。考えられるすべての計画を評価することは現実的ではない場合があり、オプティマイザーはヒューリスティックと近似に頼る必要があります。これが、システムが成長するにつれてSQLクエリー最適化がより困難になる理由の1つです。
  • 動的なデータ環境:データが頻繁に変更される場合、クエリーの動作も時間の経過とともに変化する可能性があります。かつては効率的に行われていた実行計画も、データ分布が進化するにつれて効果が低下する可能性があります。

クエリー最適化の一般的な手法

クエリー最適化は自動的に行われますが、開発者、管理者、データ・エンジニアはいくつかの最適化手法を通じて性能を向上させることができます。

効果的なインデックスの設計

インデックスは、頻繁に使用されるフィルターや結合条件をサポートすると、クエリーの性能を大幅に向上させることができます。適切に設計されたインデックスを使用すると、オプティマイザーはテーブル全体をスキャンすることなく特定の行を素早く取得できます。ただし、過剰なインデックス作成は、データ更新中にオーバーヘッドが発生する可能性があります。したがって、インデックスは、読み取り性能と書き込み効率のバランスを取るように慎重に設計する必要があります。

データベース統計の維持

オプティマイザーは統計を使用してクエリー・コストを推定するため、効率的な実行計画を維持するためには、統計を最新の状態に保つことが不可欠です。統計を定期的に更新することで、オプティマイザーはデータ分布とテーブルのサイズに関する正確な情報を得ることができます。

データのフィルタリングについて

クエリー実行の早い段階でフィルターを適用すると、クエリーの後で処理する必要がある行数が減ります。中間成果が小さいほど、クエリーの実行速度を向上させることができます。このため、早期に選択的フィルターを適用するクエリーの方が効率的に実行されることがよくあります。

不要な結合の削減

多数のテーブルを結合するクエリーは、複雑なクエリーや同様に複雑な実行計画を生成することがあります。結合が不要または冗長である場合は、結合を削除することで実行の複雑さを大幅に軽減できます。場合によっては、非正規化によって結合の必要性が減り、パフォーマンスが向上することもありますが、ストレージ使用量やデータ冗長性が増加する可能性があります。

必要な列のみを選択

不要な列を取得するクエリーにより、読み取って処理しなければならないデータの量が増加します。結果セットを必要なフィールドのみに制限すると、メモリー使用量とディスクI/O操作が削減されます。この小さな調整により、大規模なデータセットのパフォーマンスが大幅に向上します。

分割またはキャッシュ

一部の環境では、パーティショニングは非常に大きなテーブルをより管理しやすいセグメントに分割するのに役立ち、キャッシュは頻繁にアクセスされる成果に対する繰り返しのデータベース作業を軽減できます。これらのアプローチは普遍的な修正プログラムではありませんが、他の最適化ストラテジーを補完することができます。

多くのデータベース・プラットフォームには、開発者と管理者がクエリーのパフォーマンスを分析し、非効率的な実行計画を特定するのに役立つ組み込みツールも提供されています。

例えば、SQL Server Management Studio(SSMS)はクエリー性能の監視やボトルネックの特定に役立ちます。MySQL Workbenchはクエリー計画の解析や実行最適化のためのツールを提供します。Oracle SQL Tuning AdvisorはSQLクエリーの改善のための自動推奨を生成することができます。

クエリー最適化とクエリー・チューニングの比較

クエリー最適化とクエリー・チューニングは密接に関連していますが、異なるプロセスを表しています。

クエリー最適化とは、データベースが効率的な実行ストラテジーを決定するために使用する自動プロセスを指します。

対照的に、クエリー・チューニングとは、クエリーの性能を向上させるための手作業を指します。これらの作業には、非効率なクエリーの書き換え、新しいインデックスの作成、統計の更新、データベース構成設定の調整などが含まれる場合があります。

実際には、クエリー最適化とクエリー・チューニングは多くの場合、連携してデータベースの性能を向上させます。これらを組み合わせることで、本番システムでのSQLの性能を向上させるための実用的な最適化ストラテジーのセットが形成されます。

クエリー最適化の未来

クエリー最適化は、従来のコストベースの計画を超えて進化しています。最新のデータベース・システムには、クエリーの分析と実行の方法が改善されるよう、オートメーション、適応型実行、人工知能が組み込まれるようになりました。

新たな方向性の1つは、システムが性能を継続的に監視し、問題に自動的に対応する自律型データベース機能の開発です。これらのシステムは、事後対応型のトラブルシューティングに全面的に頼るのではなく、ワークロードの動作、クエリー性能、システム信号を分析し、潜在的な性能の問題を早期に特定し、是正措置を推奨します。

多くの自律型データベース・アーキテクチャーは、これらの機能を3つの運用領域に整理しており、多くの場合AIエージェントがその機能を担っています。

  • エージェント型メンテナンスは、パッチ適用、ヘルスチェック、パフォーマンス最適化などの日常的な運用タスクを自動化します。

  • エージェント型回復は、システムの動作を継続的に分析して、異常を検知するために、ユーザーに影響を与える前に、回帰、ロッキングの問題、ワークロードのボトルネックなどの異常を検知します。

  • エージェント型対応は、システムの変更内容を分析し、修復につながる状況に応じた洞察を提示することで、チームがインシデントをより迅速に解決するのに役立ちます。

これらのエージェント型機能は、データベース・チームが重要なシステムの監視を維持しながら、オートメーションが明確に定義されたオペレーション・タスクを処理する、ヒューマン・イン・ザ・ループ・モデルの中で動作するように設計されています。

組織がデータ・プラットフォームの拡張を続け、AI駆動型のアプリケーションを採用するにつれて、自身を監視、最適化、保守できるシステムが、信頼性の高いデータベースの性能を確保する上でますます重要な役割を果たすようになります。

執筆者

Tom Krantz

Staff Writer

IBM Think

Alexandra Jonker

Staff Editor

IBM Think

関連ソリューション
IBM watsonx.data

watsonx.dataを使用すると、オープンでハイブリッドな、管理されたデータ・ストアを通じて、データがどこに保存されていても、すべてのデータを使用して分析とAIを拡張できます。

watsonx.dataの詳細はこちら
データベース・ソリューション

あらゆるクラウド上でデータベースを利用してアプリケーション、分析、生成AIを実行

データベース・ソリューションはこちら
データおよびAIコンサルティング・サービス

適切な戦略、データ、セキュリティ、ガバナンスを整え、AIを効果的に拡張します。

データおよびAIコンサルティング・サービスはこちら
次のステップ

IBM watsonx.dataで、AIおよび分析のためにすべてのデータを統合を統合します。AIと分析のためのハイブリッドでオープンなデータレイクハウスで、データの所在に関わらず、あらゆるデータを活用しましょう。

  1. watsonx.dataの詳細はこちら
  2. データ管理ソリューションの詳細はこちら