PostgreSQLは 高機能なオープンソースRDBMS(データベース)です
PostgreSQLは MySQLと 肩を並べるほどの高機能なオープンソース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
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 |
インストール
ここでのインストール作業は 主に以下の流れを解説しています
- PostgreSQLソースパッケージのダウンロード
- ソースコードからのビルドと PostgreSQLバイナリファイル郡のインストール
- postgresql.conf環境設定 start/stop起動スクリプトの設定
- データベース領域の新規作成
- postmasterの起動
早速 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
#
# 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
$
$ 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に決して見劣りしていないのではないでしょうか
コメントは受け付けていません。