制作事例

実行計画?統計情報?イマイチわからないデータベース用語を解説

シェア:
  • share facebook
  • share twitter

エンジニアとして、業務を行っているとデータベースの設計に携わる機会があるでしょう。 データベースの設計は、やり方により処理速度が遅くなったりするため、重要であると言えます。 そこで、今回はデータベースの設計に関連した実行計画や統計情報について解説していきます。

まずは知りたいデータベースの基本的な実行手順

まずは知りたいデータベースの基本的な実行手順

まずは知りたいデータベースの基本的な実行手順[/caption] 統計情報や実行計画を知る前に、まずはデータベースがどのような手順で実行されるのかを説明します。 最初にシステムもしくはユーザーがSQL文を作成し、各データベース(OracleやSQLServer・MySqlなど)に送ります。 これが、実行されて結果が返ってくるまでには、下記のような流れがあります。 細かく言うとデータベースの製品ごとに多少の違いはあるかと思いますが、メインで使われることの多いRDBMSの基本的なアーキテクチャになります。

パーサー

パーサーは、システムやユーザーから投げられたSQLの解析を行い、実際にRDBMSが利用できる形に変換します。 この段階で、文法的なエラーなどをチェックするなど内部的な処理を行います。

オプティマイザ

解析されたSQLを使い、実際にデータにアクセスする順番などの計画を立てます。 詳しくは後述しますが、この計画が「実行計画」になります。 このオプティマイザの機能が、RDBMSで最も重要な機能で、オプティマイザがあるからこそ、大量のデータが瞬時に取得/集計/グループ化することが出来るのです。 この際に、テーブル同士の結合やインデックスを考慮していきます。

カタログマネージャ

オプティマイザが実行計画を作成する際には、インデックスなどを考慮すると前述しましたが、それらの情報を管理しているのがこのカタログマネージャです。 こちらも後で詳しく説明しますが、このカタログマネージャに入っているカタログ情報を「統計情報」と呼びます。

プラン評価

オプティマイザでは、単一の実行計画ではなく、複数の計画を立てます。 それらの計画を評価し、適切な実行計画を選ぶのがこのプラン評価になります。 ここで検索する手順が決まり、実行されるのです。

データベースの統計情報とは?

データベースの統計情報とは?

データベースの統計情報とは?[/caption] この章では、データベースの統計情報に関しての解説をしていきます。

統計情報とは?

データベースの統計情報とは、保存されている表やインデックスにおいてどの値がどんな頻度で使用されているのかをまとめた情報のことです。 前述したとおり、オプティマイザにて実行計画を作る際に利用される情報そのものになります。 統計情報は、意図的に作成する必要があり、テーブルごとに作成します。 例えばSQLServerでは、 「CREATE STATISTICS TEST ON TEST_TABLE (COL_1,COL_2) WITH FULLSCAN ; 」 と記載し、TESTという名前の統計情報をTEST_TABLEという名前のテーブルのCOL_1とCOL_2を元に作成します。 これらの統計情報は、 ・レコード数 ・列数とサイズ ・値の個数 ・データ分布 ・NULLの数 ・インデックス などが含まれています。 例えば、 「値がきちんと分散されている方が、均一に検索が出来るため速くなる・・・」 などをオプティマイザが判断するという仕組みになります。 また、これらの統計情報は更新しないと古い状態で残ります。 例えば、以前はAというカラムにはNULLが大量に入っていたが、運用を続ける中でデータが入るようになってきた場合。 この場合、最初はNULLが多かったのでオプティマイザとしても優先度が高くなかったはずが、統計情報を更新してデータが入っていたため、評価の優先順位が高くなるなどが考えられます。

統計情報の活用方法

統計情報は、最終更新した状態において最適な実行計画を作るための元になる情報です。 そのため、データの内容が大きく変化するような場合には、更新して利用することで活用できます。 例えば、夜間バッチ処理によってデータが総入れ替えされる場合や、 「今月の売上データ」 などのように、最新情報を入れ、且つ膨大な量のデータ件数になるようなテーブルでは、有効活用できます。

統計情報の落とし穴

統計情報の落とし穴は、オプティマイザが実行計画を作成する際に使用する統計情報が、最新の状態でないと正確な実行計画が出来ない点です。 例えば、あなたが最安値で世界一周旅行の計画を立てるとします。 その際に最新のデータではなく、3年前の飛行機代や電車賃、ホテル代を用いて計画を立てたとします。 すると、実査にその計画を実行した際に、「泊まる予定だったホテルがつぶれていた」や「実際は最安値ではなかった」等の事象が発生するでしょう。 この様に、計画を立てる時のデータというのは、最新のものである必要があります。 実行計画を作成する際の統計情報も同様に最新のものでないといけません。 こういった落とし穴に対しての施策としては、データベースから統計情報を作成する際の間隔を短くする等といった方法が考えられます。 統計情報の更新自体にも、多少の時間がかかります。 (数億件というデータになるとそれなりに更新にも時間がかかります) 必ずしも 「テーブルが更新する度に統計情報も更新する」 といった運用はおすすめできませんが、場合によっては 「バッチ処理の中に組み込む」 という事を検討した方が良いケースもあるでしょう。

統計情報と実行計画について

統計情報と実行計画について

統計情報と実行計画について[/caption] この章では統計情報と実行計画について解説をしていきます。

実行計画について

実行計画は、前述したように、SQLを実行する為の計画の事です。 この計画は、どの様な処理を行えばより短い時間でSQLの実行ができるかを計算して導き出されます。 先述した通り、実行計画はオプティマイザが作成します。

実行計画を作成する目的

データベースが判断したSQLの実行計画が、必ずしも最適な実行方法とは限りません。 特に非機能面において正しくない挙動をする可能性があります。 そういった背景から、データベースに正しい挙動をしてもらう為に、実行計画を作成します。

実行計画の確認方法

実行計画の確認を行う方法は複数ありますが、ここでは代表的な方法1つを紹介します。 その代表的な方法というのが、EXPLAIN PLAN文を用いた方法です。 EXPLAIN PLAN文を用いると、SELECT、UPDATE、INSERT、DELETE文においてオプティマイザによって選択された実行計画を表示します。 実際の使い方としては、以下のコマンドを用います。 EXPLAIN PLAN FOR select * from table; ※*にはカラム名、tableにはテーブル名です。 この様にコマンドを入力すると、実行結果の表示が出来ます。 また、実行環境とEXPLAIN PLAN文の環境が異なるため、SQL文を実際に実行する際の計画は、EXPLAIN PLAN文の実行計画とは異なる可能性があります。 そのため、EXPLAIN PLAN文を用いる際は、その点に注意が必要です。

データベース設計を見直すならAMELAに

データベース設計を見直すならAMELAに

データベース設計を見直すならAMELAに[/caption] 今回は、データベースにおける実行計画と統計情報について見てきました。 データベースの設計をする上で、非常に重要なポイントである一方で、新入社員に対する研修などでは中々出てこない内容でしょう。 しかし、業務の中では統計情報を入れるか否かで、数十分単位でストアドプロシジャが速くなる・・・というケースもあります。 AMELAでは、技術力のあるエンジニアが、しっかりとしたデータベース設計を行います。 今のシステムの速度改善に悩んでいる方や、レガシーシステムの載せ替えを検討している企業様は、是非ともご相談頂ければと思います。

WRITTEN BY

otani

イメージはマスコミの情報に形成される。 そこで私たちを待っている幸福が、私たちが望むような幸福ではないかもしれない。

関連の投稿

View More
社内SEとはどんな仕事?開発しないって本当?社内SEの仕事内容を解説
2022.06.29

社内SEとはどんな仕事?開発しないって本当?社内SEの仕事内容を解説

企業において、社内システムの開発から運用までを担当する社内SE。職場の環境や状...
基幹システムとは?|メリット・ERPとの違いについて徹底解説
2022.06.21

基幹システムとは?|メリット・ERPとの違いについて徹底解説

現在、多くの企業でITによる業務改革が行われています。労働人口が減少しつつあり...
パブリッククラウド・プライベートクラウドとは?|特徴・違いを解説
2022.06.19

パブリッククラウド・プライベートクラウドとは?|特徴・違いを解説

2006年にAmazonが始めたサービスであるクラウドコンピューティングは、現在ではあらゆ...

Q&A

よくある質問

契約、開発体制、成果物などに関してよくある質問をまとめて回答します。

Contact.

お問い合わせ

案件のご相談、パートナーの協業、取材の依頼など気軽にお問い合わせください