hakeの日記

Windows環境でプログラミングの勉強をしています。

SQLite - ビューとインデックス

sqlite> create table AAA(ii integer, tt text, rr real);
sqlite> insert into AAA values(1, 'aaa', 0.8),
   ...> (2, 'aaa', 0.7),
   ...> (3, 'bbb', 0.6),
   ...> (4, 'bbb', 0.5),
   ...> (5, 'ccc', 0.4),
   ...> (6, 'ccc', 0.3),
   ...> (7, 'ddd', 0.2),
   ...> (8, 'ddd', 0.1);

sqlite> select * from AAA;
ii          tt          rr
----------  ----------  ----------
1           aaa         0.8
2           aaa         0.7
3           bbb         0.6
4           bbb         0.5
5           ccc         0.4
6           ccc         0.3
7           ddd         0.2
8           ddd         0.1

VIEW

 

VIEWとは既存のテーブルから作成する仮想のテーブル
予め特定の条件でビューを作成しておくことで、検索においてSQLを簡潔に記述できる。

  • データをコピーするのではなく既存のテーブルへの参照?を作成する。
  • データの追加変更はできない。
  • 元テーブルが変更されるとビューの出力も変わる。
  • VIEW作成時に元テーブルのROWIDを指定しないと、VIEW側のselectで指定しても取得できない。

 

sqlite> create view VVV as select tt,rr from AAA where rr<0.5;
sqlite> select * from VVV;
tt          rr
----------  ----------
ccc         0.4
ccc         0.3
ddd         0.2
ddd         0.1

sqlite> .tables
AAA  VVV

sqlite> .mode line
sqlite> select * from sqlite_master where type='view';
    type = view
    name = VVV
tbl_name = VVV
rootpage = 0
     sql = CREATE VIEW VVV as select tt,rr from AAA where rr<0.5

sqlite> drop view VVV;
sqlite> .tables
AAA

 

INDEX

 

規模の大きいテーブルで、インデックスを作成することで検索効率を上げることができる。
ただし、テーブルが更新される毎にインデックスも更新されるのでその分は負荷がかかる。

sqlite> create index IDX on AAA(ii,tt);

sqlite> .mode line
sqlite> select * from sqlite_master where type='index';
    type = index
    name = IDX
tbl_name = AAA
rootpage = 4
     sql = CREATE INDEX IDX on AAA(ii,tt)

sqlite> drop index IDX;
sqlite> select * from sqlite_master where type='index';
sqlite>

 

UNIQUE INDEX

重複したデータが格納されていないカラムのみを指定することでユニークインデックスの作成できる。
ただし、ユニークインデックス作成後に重複データを追加するとエラーになる。

sqlite> create unique index UIDX on AAA(ii,rr);
sqlite> insert into AAA values(1,'xxx',1.0);
sqlite> insert into AAA values(1,'xxx',0.8);
Error: UNIQUE constraint failed: AAA.ii, AAA.rr

sqlite> select * from sqlite_master where type='index';
    type = index
    name = UIDX
tbl_name = AAA
rootpage = 4
     sql = CREATE UNIQUE INDEX UIDX on AAA(ii,rr)

sqlite> drop index UIDX;