連載
» 2008年08月01日 00時00分 公開

組み込みDBプログラミングの道しるべ(3):テーブルやインデックスをどうやって管理しているの? (1/2)

「システムテーブル」には、データベースに含まれるすべてのテーブル、インデックスなどのスキーマ情報が含まれている。

[加藤大受,@IT MONOist]

 前回は、データベースの根幹技術である“トランザクション管理”と“データベースがどのように物理データを管理”しているのかについて説明しました。

 データベースを利用するときはデータベースに格納されたテーブルやインデックスの情報、つまり論理構造を理解すれば問題なく使用できますが、前回説明したように組み込みデータベースを効果的に利用するためには、やはりその内部構造を詳しく理解することが重要です。

 さて、今回は前回同様“データベースの物理構造”をテーマに、データベースがどのようにテーブルやインデックスを管理しているかについて解説していきます。

スキーマを管理するシステムテーブル

 リレーショナルデータベースにおいて、SQLによるスキーマ操作、データ操作はすべてスキーマ名称を利用しています。では、これらのスキーマ情報はどこでどのように管理されているのでしょうか?

 リレーショナルデータベースには「システムテーブル」と呼ばれる管理用のテーブルがあります。この管理テーブルの名称は製品によって異なり、「システムカタログ」と呼んだり、「ディクショナリ」と呼んだりもしますが、基本的に管理している情報はほとんど変わりません。このシステムテーブルには、データベースに含まれるすべてのテーブル、インデックスなどのスキーマ情報が含まれています。そして、システムテーブルの格納場所は製品によって異なります。ディクショナリの中に含まれている製品や、システムカタログと呼ばれる場所や表領域と呼ばれる場所に格納されている製品もあります。

 ほとんどの製品でシステムテーブルは参照可能となっており、SQLを利用すればこれらの情報の閲覧も可能です。また、一部の製品では更新も可能なものもあります。例えば、日立製作所の組み込みデータベース「Entier」の場合ではシステムテーブルのことを“ディクショナリ表”と呼んでおり、表1のようなシステムテーブルが存在します。

No. 表名 内容 情報量(1行当たり)
1 SQL_TABLES データベース中の各表(ディクショナリ表を含む)の定義情報 1表分
2 SQL_COLUMNS 列に関する定義情報 1列分
3 SQL_INDEXES データベース中の各インデックス(ディクショナリインデックスを含む)の定義情報 1インデックス分
4 SQL_DIV_TABLE 表(ディクショナリ表を含む)に指定された表オプションの情報 1表分
5 SQL_DIV_INDEX インデックス(ディクショナリインデックスを含む)に指定されたインデックスオプションの情報 1インデックス分
6 SQL_DIV_COLUMN BINARY列(BINARY列のあるディクショナリ表を含む)に関する定義情報 1BINARY列分
7 SQL_DBAREAS DBエリアに関する定義情報 1DBエリア分
表1 Entierのシステムテーブル(ディクショナリ表)

 では、実際にスキーマがどのようにシステムテーブルに管理されているか実験してみましょう(注)。

※注:ご自身で実際に操作してみたい方は、Entierの体験版を利用してください。


 EntierのGUI管理ツールである「Entier Control Manager(以下、ECM)」にて「entdir」というデータベースを作成後、リスト1のSQL文でTABLE1というテーブルを作成します。

        CREATE TABLE TABLE1 
        ( 
          F1 CHAR(10) NOT NULL, 
          F2 INTEGER
        ); 
リスト1 「TABLE1」テーブルを作成するSQL文

 続いて、システムテーブル内の「SQL_TABLES」というテーブル情報を管理するテーブルのデータを参照すると、図1のように先ほど作成したTABLE1が追加されていることが分かり、SQL_TABLESテーブルの「N_COLS」列にて2つの列を持ち、「N_INDEX」列にてインデックスがないことが分かります。

テーブル情報の参照 図1 テーブル情報の参照

 次に、列情報を管理する「SQL_COLUMNS」テーブルを参照すると、TABLE1には2つの列があり、このTABLE1にはインデックスがなく、NOT NULLの列が1つあることが分かります。

 さらに、列情報を管理しているテーブル「SQL_COLUMNS」を見てみると、図2のようにTABLE1の2つの列名が「F1」「F2」であり、F1列がNOT NULLであることが分かります。今回のTABLE1にはインデックスがありませんが、インデックス情報も「SQL_INDEXES」テーブルを参照することで分かります。

列情報の参照 図2 列情報の参照

 情報系のデータベースではERやUMLにてスキーマを設計し、スキーマを作成するツールが多数存在していますが、これらのツールはすべてこのシステムテーブルを利用しているわけです。

 システムテーブルには、テーブル情報やインデックス情報だけでなく、あるテーブルが物理データファイルのどこに存在し、どのページにデータが入っているかを管理しています。インデックスについても物理データファイルのどこにリソースなどのインデックス情報が入っているかを管理しています。

 前回説明したとおり、一般的にデータベースではテーブルなどのオブジェクトは、1オブジェクトにつき1セグメントに格納されており、1セグメントは複数のページからなっているため、セグメントの情報とページ情報が分かれば、そのテーブルのデータが物理的にどこに入っているかが分かります。ただし、一般的にデータの先頭位置が分かるだけですので、単純に検索を行ってしまうと、“逐次検索(テーブルスキャン)”となってしまうため、検索に時間がかかります。ここで「インデックス」が必要になってくるわけです。

 システムテーブルには、作成されたテーブルとインデックスの情報が管理されています。一般的に、このシステムテーブルはデータベースの起動時にメモリ上のバッファに展開されます。データベースはSQL文が発行されたときに、SQL文に書かれているテーブル名や列名が存在しているかどうかをシステムテーブルに照らし合わせて処理し、参照したいデータがどの物理ファイルのどこにあるかをバッファを利用して、実際のデータ読み取りを行います。前回も説明しましたが、高速にデータを検索するには、ストレージへのI/O処理の回数を減らすことが一番です。物理ファイルへのアクセスについても、欲しいデータが格納されているテーブルの先頭ページへアクセスできれば、より高速にデータを取り出すことができます。さらにインデックスを利用すれば、欲しいデータが格納されているページに直接アクセスできますので、さらに速くデータを取り出せます。

 システムテーブルにどんな情報を管理し、どのようにシステムテーブルの情報をメモリ上に展開するかによって、必要なデータへのアクセス方法は大きく異なってくると思いますので、この仕組みについては実際に利用するデータベースのマニュアルや技術資料を参考にするといいでしょう。

       1|2 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.