PostgreSQLを試してみる

PostgreSQLは 高機能なオープンソースRDBMS(データベース)です

PostgreSQLMySQLと 肩を並べるほどの高機能なオープンソースRDBMSです
日本語環境も充実しているので 日本での普及も進んでいるようです
今回 64bit環境 IPv6環境での動作検証を行います

検証環境
CPU AMD PhenomII X4 905e (2.5GHz 4コア)
メモリ 16GB
OS Gentoo-1.12.14ベース Linux-3.0 UTF-8
コンパイラ gcc-4.5.2
Cライブラリ glibc-2.13
Perl 5.12.2
TCL 8.5.9
libxml libxml2-sources-2.7.8
libxslt libxslt-1.1.26
PAM Linux-PAM-1.1.3
SSL openssl-1.0.0d
OpenLDAP 2.4.23
PostgreSQL 9.1

NPO法人 日本PostgreSQLユーザ会

インストール

ここでのインストール作業は 主に以下の流れを解説しています

  • PostgreSQLソースパッケージのダウンロード
  • ソースコードからのビルドと PostgreSQLバイナリファイル郡のインストール
  • postgresql.conf環境設定 start/stop起動スクリプトの設定
  • データベース領域の新規作成
  • postmasterの起動

早速 PostgreSQLのダウンロードサイトからソースコードをダウンロードします
PostgreSQLダウンロード
ここではソースコードからビルドしますが
パッケージ管理機構を持つシステム用にパッケージ提供もされています

$ tar -xjf postgresql-9.1.0.tar.bz2
$ cd postgresql-9.1.0
$ ls
COPYRIGHT       HISTORY  Makefile  aclocal.m4  configure     contrib  src
GNUmakefile.in  INSTALL  README    config      configure.in  doc
$ ./configure --prefix=/usr --datadir=/usr/share/pgsql --enable-nls --with-pam --with-libxml --with-libxslt --with-perl --with-tcl --with-ldap --with-openssl
checking build system type... x86_64-unknown-linux-gnu
checking host system type... x86_64-unknown-linux-gnu
checking which template to use... linux
checking whether to build with 64-bit integer date/time support... yes
checking whether NLS is wanted... yes
checking for default port number... 5432
checking for block size... 8kB
checking for segment size... 1GB
checking for WAL block size... 8kB
checking for WAL segment size... 16MB
checking for gcc... gcc

〜

config.status: linking src/backend/port/unix_latch.c to src/backend/port/pg_latch.c
config.status: linking src/backend/port/dynloader/linux.h to src/include/dynloader.h
config.status: linking src/include/port/linux.h to src/include/pg_config_os.h
config.status: linking src/makefiles/Makefile.linux to src/Makefile.port
$ make
make -C src all
make[1]: ディレクトリ `/home/admin/postgresql-9.1.0/src' に入ります
make -C port all
make[2]: ディレクトリ `/home/admin/postgresql-9.1.0/src/port' に入ります
gcc -O2 -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Wendif-labels -Wformat-security -fno-strict-aliasing -fwrapv -I../../src/port -DFRONTEND -I../../src/include -D_GNU_SOURCE -I/usr/include/libxml2   -c -o strlcat.o strlcat.c

〜

$ su
# make install

〜

# make install-docs

〜

#
 

–datadir は設定ファイルの置き場所となります (データベース設置場所ではありません)
また事前に libxml2 libxsltなど関連ライブラリがインストールされている必要があります

さらに検証した PostgreSQL-9.1 ではドキュメント類のインストールに
make install-docs が必要でした

次に システム管理者権限の環境変数設定を行っておきます PGLIB PGDATA の2つです
下記の設定を /etc/profile 等に追記してシステムログイン時に反映されるようにします

PGLIB=/usr/lib
PGDATA=/var/db/pgsql
 

PGDATAにデータベース領域をディレクトリで指定します
今後 /var/db/pgsql/ にデータベースを作成しメインで使っていくため指定しています

最後に PostgreSQLを起動/停止するための start/stopスクリプトを作成します
スクリプトの書き方は ディストリビューションによるので下記の例は参考程度のものです
下記は Gentoo用 /etc/init.d/pgsql (root 0755)

#!/sbin/runscript
# Copyright 1999-2004 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header$

depend() {
        need net.eth0
        after apache
        provide pgsql
}

start() {
        ebegin "Starting PostgreSQL"
        su adm -s /usr/bin/bash -c "/usr/bin/pg_ctl start -w -D /var/db/pgsql -s"
        eend $?
}

stop() {
        ebegin "Stopping MySQL"
        su adm -s /usr/bin/bash -c "/usr/bin/pg_ctl stop -D /var/db/pgsql -s -m fast"
        eend $?
}

restart() {
        ebegin "Restarting MySQL"
        su adm -s /usr/bin/bash -c "/usr/bin/pg_ctl restart -w -D /var/db/pgsql -s -m fast"
        eend $?
}

status() {
        su adm -s /usr/bin/bash -c "/usr/bin/pg_ctl status -D /var/db/pgsql"
        exit $?
}
 

基本的に -D データベース領域 を指定して pg_ctl にコマンドを渡す形です
複数のデータベースディレクトリを運営する場合は その分 pg_ctlの行が増えるイメージです
(検証環境では /var/db/pgsql のみの運営とします)

stop や restart で指定している -m fast はシャットダウンモードの指定です
smart(クライアント利用終了待ち) fast(クライアント強制切断) immediate(強制終了)など
3通りモードがあります (詳しくは pg_ctl –helpで)

admアカウントをデータベース管理アカウントとして pg_ctlの各種処理を行っています
(MySQLも admアカウントで運営しているので今回流用しました
通常なら postgresアカウントを作って使うのが一般的です)

以上がインストールまでの一通りの作業です

データベースの運営

ここでは データベースの初期化 設定 IPv6接続確認 まで紹介します

まずは データベースの管理についてですが
PostgreSQLは postmaster 1プロセス毎に 1データベース領域(=ディレクトリ)を管理します
ディレクトリの中に データベース(複数) 各種ログ 設定ファイル が含まれます

ここでは先ほどの start/stopスクリプトで定義したとおり
admアカウントを管理アカウントとする /var/db/pgsql/ を初期化します

# mkdir /var/db/pgsql
# chown adm /var/db/pgsql
# su adm -s /usr/bin/bash -c "initdb $PGDATA"
データベースシステム内のファイルの所有者は"adm"ユーザでした。
このユーザがサーバプロセスを所有しなければなりません。

データベースクラスタはロケールja_JP.utf8で初期化されます。
デフォルトのデータベース符号化方式はUTF8に設定されました。
initdb: ロケール"ja_JP.utf8"用の適切なテキスト検索設定が見つかりません
デフォルトのテキスト検索設定はsimpleに設定されました。

ディレクトリ/var/db/pgsqlの権限を設定しています ... ok
サブディレクトリを作成しています ... ok
デフォルトのmax_connectionsを選択しています ... 100
デフォルトの shared_buffers を選択しています ... 24MB
設定ファイルを作成しています ... ok

〜

警告: ローカル接続向けに"trust"認証が有効です。
pg_hba.confを編集する、もしくは、次回initdbを実行する時に-Aオプショ
ンを使用することで変更することができます。

成功しました。以下を使用してデータベースサーバを起動することができます。

    postmaster -D /var/db/pgsql
または
    pg_ctl -D /var/db/pgsql -l logfile start
#
 

ここでは initdbコマンドを直接叩きましたが
pg_ctlからでも同様のことができるので pg_ctlに統一したほうが覚えやすいかもしれません

/var/db/pgsql/ 内が初期化されデータベース領域を利用する準備が整いました

# ls /var/db/pgsql/
PG_VERSION  pg_hba.conf    pg_serial    pg_twophase      postmaster.pid
base        pg_ident.conf  pg_stat_tmp  pg_xlog
global      pg_multixact   pg_subtrans  postgresql.conf
pg_clog     pg_notify      pg_tblspc    postmaster.opts
#
 

ユーザ管理についてですが この時点では
データベース管理ユーザとして initdbを行ったアカウント adm が設定されています

次に設定ファイル postgresql.conf pg_hba.conf pg_ident.conf をカスタマイズします
まず postgresql.conf から設定します
以下は追記/編集した行のみの情報です

data_directory = '/var/db/pgsql'
hba_file = '/var/db/pgsql/pg_hba.conf'
ident_file = '/var/db/pgsql/pg_ident.conf'

listen_addresses = 'localhost,fe80::1***:****:****:***a%eth0'
 

data_directory はデータベース領域そのものを表します
hba_file は pg_hba.conf の置き場所を指定します
ident_file は pg_ident.conf の置き場所を指定しますが
ident認証方式を選択したときに利用されるだけで 今回の検証では ident認証方式は使いません

listen_address は 接続を行うインターフェースを指定するものです
デフォルトは 'localhost' となり外部ホストから接続を受け付けません
IPアドレスを指定することでそのIPで listen()するようになります
(ちなみに PostgreSQL7系まで使われていた tcpip_socket は廃止となっています)
今回 localhost も /etc/hosts では ::1 になっているので完全な IPv6仕様です

続いて認証に関する設定は pg_hba.conf 内で設定します

local    all             all                                     trust
host     all             all             127.0.0.1/32            trust
host     all             all             ::1/128                 trust

host     all             gamer           fe80::1***:****:****:***a/64   md5
 

上3行はローカルホストからの接続設定で 全データベースユーザを無条件に利用可能(trust)
最後1行が追加行で IPv6アドレスのみ許可 パスワード認証(md5)も実施する設定です
(IPv6のアドレスの箇所は伏字で標記しています)
IPv6部分はリンクローカルアドレスを使うことでグローバルからのパケットは届かない仕組みです
gamerというアカウントに制限しているので 後ほど gamerアカウントを作成することにします

pg_ident.conf は今回使いません

以上で データベース領域の初期化と設定が完了です 早速 postmaster を起動しましょう

# /etc/init.d/pgsql start
 * Starting PostgreSQL ...
/usr/bin/postgres: /lib64/libz.so.1: no version information available (required by /usr/lib64/libxml2.so.2)
/usr/bin/postgres: /lib64/libz.so.1: no version information available (required by /usr/lib64/libxml2.so.2)
LOG:  データベースシステムは 2011-09-19 22:52:24 UTC にシャットダウンしました
LOG:  データベースシステムの接続受付準備が整いました。
LOG:  自動バキュームランチャプロセス                                      [ ok ]
# netstat -an | grep 5432
tcp6       0      0 fe80::1***:***:**:5432 :::*                    LISTEN     
tcp6       0      0 ::1:5432                :::*                    LISTEN     
unix  2      [ ACC ]     STREAM     LISTENING     43186    /tmp/.s.PGSQL.5432
#
 

IPv6で接続が可能な状態となっています ローカルホストから UNIXドメインソケット接続も可能です
ポート番号も 5432 でデフォルトのままです
(複数の postmasterを運用する場合カスタマイズする必要あります)

データベース領域に データベースを1つ追加します games という名前で作成します

$ createdb -h localhost -U adm games
$
 

-h localhost は接続先データベースホストを指定します localhostならば省略可能です
-U adm は指定必要です データベース管理権限ユーザを指定します

追加ユーザも作っておきましょう
pg_hba.conf では gamer を外部接続用に定義しているので gamerユーザを作成します

$ createuser -U adm gamer
新しいロールをスーパーユーザにしますか? (y/n)n
新しいロールに対してデータベースを作成する権限を与えますか? (y/n)n
新しいロールに対して別のロールを作成する権限を与えますか? (y/n)n
$
 

-P オプションでパスワードを同時に設定することもできますが 次のように DDLで設定します

$ psql -U adm games
psql (9.1.0)
"help" でヘルプを表示します.

games=# alter user gamer encrypted password 'gamer';
ALTER ROLE
games=# \\q
$
 

データベースに接続するために psql コマンドを使いました
データベース接続後 サブシェルが開いて各種コマンドが発行できます

とりあえずローカルホスト上でデータベースに接続できることを確認し
gamerのパスワードを設定しました

では IPv6接続の検証を行います 別ホストの端末から psqlで接続します

$ psql -U gamer -h fe80::1***:****:****:***a%eth0 games
Password for user gamer:
Welcome to psql 8.3.0 (server 9.1.0), the PostgreSQL interactive terminal.

Type:  \copyright for distribution terms
       \h for help with SQL commands
       \? for help with psql commands
       \g or terminate with semicolon to execute query
       \q to quit

WARNING:  You are connected to a server with major version 9.1,
but your psql client is major version 8.3.  Some backslash commands,
such as \d, might not work properly.

games=> \\q
$
 

psql に -h オプションで外部ホストを明示します Linuxでは %eth0 も必要でした
別ホスト側が PostgreSQL-8.3.0 を使っていたので警告が表示されていますが
IPv6での接続性は OKです

ただし 以降のデータベース操作検証は PostgreSQL-9.1.0側のサーバに戻って実施します
理由は別ホスト側の文字コードが EUC-JP サーバ側の UTF-8 と食い違っているため
文字化けするのです

テーブルの作成と動作検証

gamesデータベースまで作成したので
実際にレトロ系テレビゲームのデータを投入して 各種検索もデモします

サンプルデータ tvgames.zip(EUC-JP) をデータベース化します

$ eunzip tvgames.zip
Archive:  tvgames.zip
  inflating: tvgames.txt
$ head -n 10 tvgames.txt | iconv -f euc-jp
ドンキーコング,FC,任天堂,4500,1983-07-15
ドンキーコングJR.,FC,任天堂,4500,1983-07-15
ポパイ,FC,任天堂,4500,1983-07-15
五目ならべ [連珠],FC,任天堂,4500,1983-08-27
麻雀,FC,任天堂,4500,1983-08-27
マリオブラザーズ,FC,任天堂,4500,1983-09-09
ポパイの英語遊び,FC,任天堂,4500,1983-11-22
ベースボール,FC,任天堂,4500,1983-12-07
ドンキーコングJR. の算数遊び,FC,任天堂,4500,1983-12-12
テニス,FC,任天堂,4500,1984-01-14
$
 

ファミコンから プレイステーション1まで 全11429タイトルを納めているので
検証用のデータベース素材としてお手頃です

このデータを格納するテーブルを作成します

$ psql -U gamer games
psql (9.1.0)
"help" でヘルプを表示します.

games=> create table tvgames ( name text, plathome text, company text, price int, release_date date );
CREATE TABLE
games=> \\dt
           リレーションの一覧
 スキーマ |  名前   |    型    | 所有者 
----------+---------+----------+--------
 public   | tvgames | テーブル | gamer
(1 行)

games=> \\d tvgames
    テーブル "public.tvgames"
    カラム    |   型    | 修飾語 
--------------+---------+--------
 name         | text    | 
 plathome     | text    | 
 company      | text    | 
 price        | integer | 
 release_date | date    | 

games=> \\q
$
 

\\dt と叩けば定義されているテーブルを一覧で確認できます
\\d テーブル名 でテーブルの定義も見れます

サンプル tvgames.txtを insert文に加工して SQL投入できるようにします

$ iconv -f euc-jp -t utf-8 tvgames.txt | sed "s/'/''/g" | sed "s/^\\(.*\\),\\(.*\\),\\(.*\\),\\(.*\\),\\(.*\\)$/insert into tvgames ( name, plathome, company, price, release_date ) values ( '\\1', '\\2', '\\3', \\4, '\\5' );/" | less -r > tvgame_insert.txt
$ head -n 10 tvgame_insert.txt
insert into tvgames ( name, plathome, company, price, release_date ) values ( '', 'FC', '任天堂', 4500, '1983-07-15' );
insert into tvgames ( name, plathome, company, price, release_date ) values ( 'JR.', 'FC', '任天堂', 4500, '1983-07-15' );
insert into tvgames ( name, plathome, company, price, release_date ) values ( '', 'FC', '任天堂', 4500, '1983-07-15' );
insert into tvgames ( name, plathome, company, price, release_date ) values ( ' [連珠]', 'FC', '任天堂', 4500, '1983-08-27' );
insert into tvgames ( name, plathome, company, price, release_date ) values ( '', 'FC', '任天堂', 4500, '1983-08-27' );
insert into tvgames ( name, plathome, company, price, release_date ) values ( '', 'FC', '任天堂', 4500, '1983-09-09' );
insert into tvgames ( name, plathome, company, price, release_date ) values ( '', 'FC', '任天堂', 4500, '1983-11-22' );
insert into tvgames ( name, plathome, company, price, release_date ) values ( '', 'FC', '任天堂', 4500, '1983-12-07' );
insert into tvgames ( name, plathome, company, price, release_date ) values ( 'JR. の算数遊び', 'FC', '任天堂', 4500, '1983-12-12' );
insert into tvgames ( name, plathome, company, price, release_date ) values ( '', 'FC', '任天堂', 4500, '1984-01-14' );
$
 

PostgreSQLでは ' をエスケープするために '' と 2つ重ねて指定します

では作成した insert文を流し込みますが
psql に -f でテキストファイルを指定すれば テキストの内容を順番に実施してもらえます

$ psql -U gamer -f tvgame_insert.txt games
INSERT 0 1

〜

INSERT 0 1
$
 

tvgamesテーブルの完成です
実際に SQLの select構文を使って各種検索をためしてみます まずは10レコード分の表示です

$ PAGER=cat psql -U gamer games
psql (9.1.0)
"help" でヘルプを表示します.

games=> select * from tvgames limit 10;
             name             | plathome | company | price | release_date 
------------------------------+----------+---------+-------+--------------
 ドンキーコング               | FC       | 任天堂  |  4500 | 1983-07-15
 ドンキーコングJR.            | FC       | 任天堂  |  4500 | 1983-07-15
 ポパイ                       | FC       | 任天堂  |  4500 | 1983-07-15
 五目ならべ [連珠]            | FC       | 任天堂  |  4500 | 1983-08-27
 麻雀                         | FC       | 任天堂  |  4500 | 1983-08-27
 マリオブラザーズ             | FC       | 任天堂  |  4500 | 1983-09-09
 ポパイの英語遊び             | FC       | 任天堂  |  4500 | 1983-11-22
 ベースボール                 | FC       | 任天堂  |  4500 | 1983-12-07
 ドンキーコングJR. の算数遊び | FC       | 任天堂  |  4500 | 1983-12-12
 テニス                       | FC       | 任天堂  |  4500 | 1984-01-14
(10 行)

games=> 
 

1983年はファミコンが発売されてから爆発的にヒットする直前です

psqlは PAGER環境変数に設定されたプログラムで selectの結果を表示します
デフォルトの less が一番使い勝手がよいですが ページ送りが不要な場合など cat を指定します

次に 1995年4月1日〜5月1日 の間に発売されたソフトの一覧を表示します between構文を使います

games=> select * from tvgames where release_date between '1995-4-1' and '1995-5-1';
                            name                             |      plathome      |                 company                  | price | release_date 
-------------------------------------------------------------+--------------------+------------------------------------------+-------+--------------
 EMIT Vol.2〜命がけの旅〜                                    | SS                 | 光栄                                     |  8800 | 1995-04-01
 EMIT Vol.3〜私にさよならを〜                                | SS                 | 光栄                                     |  8800 | 1995-04-01
 デイトナUSA                                                 | SS                 | セガ                                     |  6800 | 1995-04-01
 レディーストーカー〜過去からの挑戦〜                        | SFC                | タイトー                                 |  9980 | 1995-04-01
 Dの食卓                                                     | 3DO                | 三栄書房                                 |  8800 | 1995-04-01
 蒼き伝説シュート!                                           | GB                 | バンプレスト                             |  3980 | 1995-04-07
 THE クイズ ギアファイト!                                    | GG                 | セガ                                     |  3800 | 1995-04-07
 クイズ キング・オブ・ファイターズ                           | NG(CD)             | ザウルス                                 |  5800 | 1995-04-07
 得点王3                                                     | NG                 | SNK                                      | 29800 | 1995-04-07
 フォーメーションサッカー95 della セリエA                    | PCE(SCDR2)(AC対応) | ヒューマン                               |  9800 | 1995-04-07
 全日本プロレス2 3・4武闘館                                  | SFC                | 日本コンピュータシステム                 | 10800 | 1995-04-07
 ドラえもん 友情伝説                                         | 3DO                | 小学館                                   |  7800 | 1995-04-07
 SD飛龍の拳外伝                                              | GB                 | カルチャーブレーン                       |  4700 | 1995-04-14
 勝馬予想 競馬貴族EX'95                                      | GB                 | キングレコード                           |  6900 | 1995-04-14
 ワールドヒーローズ2                                         | NG(CD)             | ADK                                      |  5800 | 1995-04-14
 パチ夫くん パチンコランド大冒険                             | PS                 | ココナッツジャパン                       |  6800 | 1995-04-14
 柿木将棋                                                    | SS                 | アスキー                                 |  7800 | 1995-04-14
 ぱずるんでス!                                               | SFC                | 日本物産                                 |  8980 | 1995-04-14
 RES ARCANA                                                  | SFC                | ココナッツジャパン                       |  9500 | 1995-04-14
 EMIT Vol.1 時の迷子                                        | 3DO                | 光栄                                     |  8800 | 1995-04-14
 デビルズコース                                              | 3DO                | 松下電器                                 |  8800 | 1995-04-14
 パドックノート’95                                           | 3DO                | フジテレビジョン                         |  8800 | 1995-04-14
 MYST                                                        | 3DO                | マイクロキャビン                         |  7800 | 1995-04-14
 Jリーグ ライブ'95                                           | GB                 | エレクトロニック・アーツ・ビクター       |  5980 | 1995-04-21
 カオティクス                                                | 32X                | SEGA                                     |  7800 | 1995-04-21
 餓狼伝説3 ROAD TO THE FINALVICTORY                          | NG                 | SNK                                      | 32000 | 1995-04-21
 ギャラクシーファイト UNIVERSAL WARRIORS                     | NG(CD)             | サンソフト                               |  7800 | 1995-04-21
 サイバーリップ                                              | NG(CD)             | SNK                                      |  5800 | 1995-04-21
 ファイヤースープレックス                                    | NG(CD)             | SNK                                      |  5800 | 1995-04-21
 ベースボールスターズプロフェッショナル                      | NG(CD)             | SNK                                      |  4800 | 1995-04-21
 ロボアーミー                                                | NG(CD)             | SNK                                      |  5800 | 1995-04-21
 金沢将棋'95                                                 | PS                 | セタ                                     |  7900 | 1995-04-21
 ママレード・ボーイ                                          | SFC                | バンダイ                                 |  9800 | 1995-04-21
 魔法陣グルグル                                              | SFC                | エニックス                               | 10800 | 1995-04-21
 タクティカルサッカー                                        | SFC                | エレクトロニックアーツビクター           |  9800 | 1995-04-21
 なつきクライシスバトル                                      | SFC                | エンジェル                               | 10800 | 1995-04-21
 真・聖刻                                                    | SFC                | ユタカ                                   |  9800 | 1995-04-21
 真SD戦国伝 大将軍列伝                                       | SFC                | ベック                                   |  9800 | 1995-04-21
 スーパーリアル麻雀P5 パラダイス オールスター4人打ち         | SFC                | セタ                                     |  9800 | 1995-04-21
 リジョイス〜アレサ王国の彼方〜                              | SFC                | やのまん                                 |  9900 | 1995-04-21
 宮路社長のパチンコファン勝利宣言2                           | SFC                | POW                                      |  9800 | 1995-04-21
 スーパートランプコレクション                                | SFC                | ボトムアップ                             |  8900 | 1995-04-21
 紺碧の艦隊                                                  | 3DO                | 徳間書店                                 |  8800 | 1995-04-21
 ぼのぐらし                                                  | 3DO                | アミューズ/バンダイビジュアル           |  8800 | 1995-04-21
 ポリスノーツ パイロットディスク                             | 3DO                | コナミ                                   |  2980 | 1995-04-21
 パズルボブル                                                | NG(CD)             | タイトー                                 |  6800 | 1995-04-27
 赤ずきんチャチャ                                            | GB                 | トミー                                   |  3900 | 1995-04-28
 空想科学少年ガリバーボーイ 空想科学パズル プリッとポン      | GB                 | バンダイ                                 |  3980 | 1995-04-28
 チキチキ天国                                                | GB                 | J・ウイング                              |  3900 | 1995-04-28
 パチ夫くん3                                                 | GB                 | ココナッツジャパン                       |  4800 | 1995-04-28
 魔法陣グルグル 勇者とククリの大冒険                         | GB                 | タカラ                                   |  3980 | 1995-04-28
 TEMPO Jr.                                                   | GG                 | セガ                                     |  3800 | 1995-04-28
 テイルスのスカイパトロール                                  | GG                 | セガ                                     |  3800 | 1995-04-28
 テレビアニメスラムダンク 強豪真っ向対決!                    | MD                 | バンダイ                                 |  8800 | 1995-04-28
 トゥルーライズ                                              | MD                 | アクレイムジャパン                       |  7800 | 1995-04-28
 餓狼伝説3 ROAD TO THE FINALVICTORY                          | NG(CD)             | SNK                                      |  8800 | 1995-04-28
 スロット勝負師                                              | PCE(SCDR2)         | 日本物産                                 |  8500 | 1995-04-28
 ガンナーズ ヘブン                                           | PS                 | ソニー・コンピュータエンタテインメント   |  5800 | 1995-04-28
 ぐっすんおよよ                                              | PS                 | エクシング                               |  6800 | 1995-04-28
 ジャンピングフラッシュ!アロハ男爵ファンキー大作戦の巻       | PS                 | ソニー・コンピュータエンタテインメント   |  5800 | 1995-04-28
 ミスランド まちがい探しゲーム                               | PS                 | アルトロン                               |  5800 | 1995-04-28
 ヴァーチャル ハイドライド                                   | SS                 | セガ                                     |  5800 | 1995-04-28
 アイルトン・セナ パーソナルトーク〜Message for the future〜 | SS                 | セガ                                     |  8800 | 1995-04-28
 輝水晶伝説アスタル                                          | SS                 | セガ                                     |  5800 | 1995-04-28
 三國志4                                                     | SS                 | 光栄                                     | 14800 | 1995-04-28
 スーパーボンバーマン3                                       | SFC                | ハドソン                                 |  8900 | 1995-04-28
 スーパーパチンコ大戦                                        | SFC                | バンプレスト                             |  6900 | 1995-04-28
 牌勢麻雀 凌駕                                               | SFC                | アスキー                                 | 12800 | 1995-04-28
 プラネットチャンプ TG3000                                   | SFC                | ケムコ                                   |  9500 | 1995-04-28
 Jリーグエキサイトステージ'95                                | SFC                | エポック社                               |  9800 | 1995-04-28
 川のぬし釣り2                                               | SFC                | パックインビデオ                         | 10800 | 1995-04-28
 シミュレーションプロ野球                                    | SFC                | ヘクト                                   | 12800 | 1995-04-28
 トゥルーライズ                                              | SFC                | アクレイムジャパン                       | 10900 | 1995-04-28
 3次元格闘ボールズ                                           | SFC                | メディアリング                           |  9800 | 1995-04-28
 タロットミステリー                                          | SFC                | ヴィジット                               |  9800 | 1995-04-28
 初段位認定 初段プロ麻雀                                     | SFC                | ギャップス                               |  9800 | 1995-04-28
 バーチャルカメラマンPart3                                   | 3DO                | ナグザット                               |  8800 | 1995-04-28
 ワールドカップ スーパースタジアム                           | 3DO                | テレビ東京/ギャガ・コミュニケーションズ |  6800 | 1995-04-28
(78 行)

games=>
 

NeoGeoのロムの値段の高さにびっくりしますが スーパーファミコンも1万円越えなど結構な値段です

次に group by 構文を使った機種別ソフト本数の集計です

games=> select plathome, count( name ) from tvgames group by plathome;
       plathome        | count 
-----------------------+-------
 GG                    |   196
 SFC                   |  1391
 PCE(SG)               |     4
 MCD                   |   110
 PCE(SCDR2)            |   235
 NG(CD)                |    99
 FCD                   |   195
 NG                    |   117
 PCE(CDR2)             |    92
 32X                   |    18
 GBC                   |   142
 PS                    |  4439
 SFC(NP)               |    33
 ARCADE CARD専用       |    12
 N64                   |   200
 FC周辺ソフト          |     9
 SS                    |  1212
 VB                    |    19
 GB&GBC               |   201
 GB                    |   767
 64DD                  |     7
 ※バーコードボーイ同梱 |     1
 3DO                   |   215
 FC                    |  1042
 PCE(SCDR2)(AC対応)    |    16
 PCE                   |   229
 MD                    |   416
 PCE(CDR2)(S対応)      |    12
(28 行)

games=>
 

最後に 複雑なクエリを実行して PostgreSQLのパフォーマンスを確認します

名称の先頭部分が一致することを条件にして 5作以上シリーズ化されているゲームを抜き出そうとしてます
例えば「ドラゴンクエスト」をベース名として「ドラゴンクエスト2」「ドラゴンクエスト3」…
を抜き出そうとしています

games=> select gbase.name, gelement.name, gelement.release_date, gelement.plathome, gelement.price from ( select distinct name from  tvgames ) as gbase, tvgames gelement where octet_length( gbase.name ) > 3 and left( gelement.name, char_length( gbase.name ) ) = gbase.name and ( select count( name ) from tvgames gsub where gbase.name != gsub.name and left( gsub.name, char_length( gbase.name ) ) = gbase.name ) >= 4 order by gbase.name, gelement.release_date;

〜

 悠久幻想曲                               | 悠久幻想曲 Ensemble Vol.1                                                                                 | 1998-12-10   | PS               |  3800
 悠久幻想曲                               | 悠久幻想曲Ensemble Vol.2                                                                                  | 1999-02-18   | PS               |  3800
 悠久幻想曲                               | 悠久幻想曲 ensemble vol.2                                                                                 | 1999-03-04   | SS               |  3800
 悠久幻想曲                               | 悠久幻想曲 保存版 PerpetualCollection                                                                     | 1999-10-14   | PS               |  8800
 悠久幻想曲                               | 悠久幻想曲3 パーペチュアルブルー                                                                          | 1999-12-22   | PS               |  5800
 遊戯王デュエルモンスターズ               | 遊戯王デュエルモンスターズ                                                                                | 1998-12-17   | GB               |  4300
 遊戯王デュエルモンスターズ               | 遊戯王デュエルモンスターズ2 闇界決闘記                                                                    | 1999-07-08   | GB&GBC          |  4500
 遊戯王デュエルモンスターズ               | 遊戯王デュエルモンスターズ3 三聖戦神降臨                                                                  | 2000-07-13   | GBC              |  4500
 遊戯王デュエルモンスターズ               | 遊戯王デュエルモンスターズ4 最強決闘者戦記 海馬デッキ                                                     | 2000-12-07   | GBC              |  4800
 遊戯王デュエルモンスターズ               | 遊戯王デュエルモンスターズ4 最強決闘者戦記 城之内デッキ                                                   | 2000-12-07   | GBC              |  4800
 遊戯王デュエルモンスターズ               | 遊戯王デュエルモンスターズ4 最強決闘者戦記 遊戯デッキ                                                     | 2000-12-07   | GBC              |  4800
(1749 行)

games=> \\q
$
 

1万レコードのテーブルを 2つ組み合わせて検索する高負荷な処理ですが
検証環境では実行時間は 61秒でした
驚くことに MySQLで同様の検索をしたときは 2分20秒だったのに比べ半分以下の時間となってます
PostgreSQLの最適化能力の高さが感じとれます

紹介は以上です PostgreSQLは機能としても高機能で
商用データベースである Oracleに決して見劣りしていないのではないでしょうか

IPv6サーバツールへ戻る

コメントは受け付けていません。