TOP

データベース sqlite3 その14

売上管理システム3・viewとindex利用

about view and index

viewは使い勝手のよい表示をするために生成されます。indexは多量なレコードを素早く見つけるために使われるものです。

データを表示するのにselect ステートメントを使ってターゲットとなるテーブルを指定して行います。しかし、複数のテーブルを結合させて表示するような場合は、その為に、長々とsql 文を書かなければいけないため、大変です。ビューとして予め生成しておけば、このような手間を省けます。

売り上げ管理システムデータベースを使って、このビューの使い方を見ていきたいと思います。

テーブルは以下のように生成されています。

view の利用 [CREATE VIEW]

ビューは仮想テーブルなので、データの追加、更新、削除は出来ません。(但し、INSTEAD OF トリガーの場合は可能)利用目的は以下のようです。

  • 正規化されたテーブル表示ではなく、直感的に感じる方法でデータを構造化し、表示できる。
  • 完全なテーブルではなく限られたデータのみを表示できる。
  • レポートの生成に使用できる。
CREATE [TEMP | TEMPORARY] VIEW view_name AS SELECT column_name FROM table_name WHERE conditions;
table_nameテーブルから条件式にしたがって析出されたcolumn_name列を列とするビューを作成する。
SELECT column_name FROM view_name;
view_nameビューを表示する。
  元のテーブルの値が書き換えられると、select の実行結果が異なることがあります。
  insert文・update文・delete文は使用できない。
DROP INDEX database_name.view_name;
 ビューの削除

「CREATE」と「VIEW」の間に「TEMP」または「TEMPORARY」キーワードがある場合、作成されたビ-ーは、データベース接続が閉じられると自動的に削除されます。この場合は、viewにスキーマ名をつけてはいけない。

注文テーブルの外部キーに対応する名前データをviewに加える。

データ検索を高速化する index [CREATE INDEX]

index 作成は、本の索引を作るのと同じです。指定のデータにすばやくたどりつける目的で作られます。但し、SELECT クエリと WHERE 句を高速化するのに役立ちますが、UPDATE および INSERT ステートメントでのデータ入力を遅くします。index はテーブル内のデータへのポインター(実データへのアドレス)なので、データそのものには、削除・作成に影響を与えません。但し、以下の場合は作成するメ リットがありません。

  • 小さなテーブル。
  • 大規模なデータの更新・挿入が行われるテーブル
  • 多数の NULL 値を含む列。
  • 頻繁に操作される列。
CREATE [UNIQUE] INDEX インデックス名 ON テーブル名(カラム名)[WHERE 条件式];
UNIQUE 指定により、重複が生じた場合のエラー表示が出来ます。
WHERE句があると部分インデックスが作られます。
.indexes ?TABLE?         Show names of indexes
DROP INDEX インデックス名 インデックスを削除する。

index 利用するデータ量が無い、小さなテーブルですが、参考として、購入者 buyer テーブルの name 列にインデックスの仕組みを説明してみたいと思います。

インデックスをつけるということとは

インデックスによるデータ探査の仕組み

データベースのレコードはB木などの多分木というデータ構造として読み込まれます。rowidを持ったテーブルのレコードも、rowid列(あるいはprimary制約を持った列)をキーとした形で格納されます。

ある列にインデックスをつけるということは、rowid列の場合と同様に、その列をキーとして、多分木のデータ構造で仮想にデータ構造が作られると いうことになっております。多分木データの読み出しコストは、データ数をNとした場合に、logN に比例します。このことが、レコードを高速に読み出すことにつながっております。

インデックスを使わないbuyerテーブルの「name=’kato’ 」条件における「del_flag」の値を検索する

  1. id列をキーとした多分木のデータ構造一つ一つのキーに対して、「name=’kato’」の条件を満たすレコードを検索する。—> オーダーNの線形探査になる。
  2. 該当レコードからdel_flagの値を得る

インデックスを使ったbuyerテーブルの「name=’kato’ 」条件における「del_flag」の値を検索する

  1. name列をキーとした多分木のデータ構造をたどる。—> オーダーlogNの探査になる。
  2. ターゲットとなる「name=’kato’」行にたどりつく。
  3. 「name=’kato’」行のid属性の値からbuyerテーブルの多分木データ構造であるidのレコードを得る。—> オーダーlogNの探査になる。
  4. そのdel_flagの値を得る。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください