インピーダンスミスマッチ
「オブジェクト指向設計」と「リレーショナルデータベース設計」の設計思想の違いから発生するミスマッチ。そのためにO/Rマッピングが存在する。
「オブジェクト指向設計」と「リレーショナルデータベース設計」の設計思想の違いから発生するミスマッチ。そのためにO/Rマッピングが存在する。
今日、Oracle 10gのiSQL*PlusからSQLを発行していたときにPostgreSQLで実行していたときと同じようにLIMIT句をSELECT文の最後に付けて発行したらなぜかエラーになった。
LIMITなんてしらねーよって。。。。
ま、まさかLIMITがSQL標準ではないのか??と思って探したら、やはりSQL標準ではないようです。(最後のほうに載っています)
PostgreSQLではランダムに取り出す ORDER BY random()というユーザー定義関数を使った並び替えもできるのだが、PostgreSQLに慣れるとどれが標準なのかわからずに使ってしまい、結果的に危ないかも。。。
でも確か、LIMITはMySQLでも使えたはずだから、事実上の標準であり、ただしOracleは対応していないと考えることもできるのかもしれない??
phpMyAdminはVer.2.8.2以前と以降では認証方法が変わったらしい。特にデータベースへアカウント情報を保持しなければならなくなったので、少しは面倒になったようだ。
セキュリティ上の問題があるVer.2.7.0plを使う場合には、Basic認証等の何らかの第三者に使われないような仕組みを別途用意すべきだろう。旧バージョンはSourceForge.netからダウンロードできる。
PostgreSQLのストアドプロシージャPL/PHPに関する説明。アプリケーションサーバーとDBサーバー間でのオーバーヘッドが無視できない状況においては、検討する価値は十分あるだろう。
取り出したデータがNULLのとき、「-」表示をしたい場合などはどのようにされていらっしゃるだろうか?たとえばプログラム側でデータを取り出してきて、NULLだったら代わりに「-」を出力するというロジックが思いついた場合には、COALESCEというSQL92の関数の利用を検討すると良いと思う。
たとえば、hogehogeフィールドからデータを取得したい場合には、
SELECT COALESCE(hogehoge, '-')
FROM table_name;
とすることでhogehogeがNULLだった場合に-が返るようになる。SQL92対応なので、基本的にはどのRDBMSでも対応しているはず。COALESCEは引数を無制限にとるので、COALESCE(a, b, c)ならばaがNULLならbが、bがNULLならcが利用されるといった形になってとても便利である。
このようなテクニックが数多く掲載されているプログラマのためのSQL 第2版はSQLを日ごろ利用している人でも一見の価値があると思う。
pgpool-IIなるものがリリースされていました。pgpoolでは2台までしか負荷分散できないという恐ろしい制約がありましたが、pgpool-IIではその制約もなくなり、pgpoolAdminというWebで設定可能なツールも用意されています。これは検証してみる価値はありそうですね。
http://pgpool.sraoss.jp/index.php
http://pgpool.projects.postgresql.org/pgpool-II/ja/
テスト環境がBladeSymphony (10 blade)っておそらく反則だと思います。そうそうこんな環境は用意できませんから。
PostgreSQLには高可用性と負荷分散に関する製品が存在するが、いずれもフリーだ。メリットとデメリットは以下のとおり。
Slony-I(スローニーワン)
シングルマスターマルチスレーブ方式。メリットはクラスター数に制限が無いこと。クラスター数を増やしても負荷が増えない(スレーブのスレーブにもできる)こと。デメリットはマスターからのコピー時間を制限できないこと。このことによりスレーブ間に時差が発生することがある。
pgpool(ピージープール)
マルチマスター方式。メリットは仕組みが非常に簡単(クエリを単純に自分自身とスレーブに投げるだけ)。デメリットはクラスター数が2台まで。完全にノード間が同じ状態であるか(クエリーエラーを考慮しないので、マスターとスレーブが同期されない可能性がある)は保証されない。
PGCluster(ピージークラスター)
マルチマスター方式。メリットはクラスター数に制限が無いこと。
クエリを負荷に応じて分散するロードバランサー、更新系クエリを他のノードにコピーしてクラスター間が正しい状態かどうかを監視するレプリケーション、そしてクラスターの最低3台が必要。もちろんすべてを1台で兼ねることもできるが、何ら意味は無い。
デメリットは、クラスターが増えるとノードすべてにコピーを反映させるのに時間がかかるようになり、指数関数的に待ち時間が増える(もちろん選択系クエリはクラスタが多いほうが早い)こと。負荷が多くなるとなぜかコピーが正常に行えない問題などがある。
おそらく選択系クエリと更新系クエリのどちらの頻度が多いかによって選ぶべきなのだろうと思われる。
ALTER TABLE, DROP TABLE, DROP INDEX, VACUUM FULLを(特にトランザクション中で)使ってしまうとすべてのクエリが待たされてしまう。これはPostgreSQLの仕様なのだがなぜこれらが全ロックをする必要があるのか不思議でならない。
http://www.h7.dion.ne.jp/~matsu/feature/postgresql/sql-intro/transaction-lock.html
http://www.postgresql.jp/document/pg803doc/html/explicit-locking.html
こんなソフトがあるらしい。GUIベースでSQLが発行できます。さまざまなデータベースに対応していて、便利なソフトウエア。ただ、最近はWebでSQLが発行できるphpPgAdminやphpMyAdminなどがあるので、あまり使われない? - ダウンロードはこちら
PostgreSQLのベンチマークソフト。contribに収録されているので、rpmの場合には、postgresql-contribを利用する。
http://pcweb.mycom.co.jp/column/yetanother/051/
インストールしてもスキーマが作成されていないためにエラーになることがあった。この場合、以下のSQLを事前に投げつければ良い。
CREATE TABLE accounts (
aid integer NOT NULL,
bid integer,
abalance integer,
filler character(84)
);
CREATE TABLE branches (
bid integer NOT NULL,
bbalance integer,
filler character(88)
);
CREATE TABLE history (
tid integer,
bid integer,
aid integer,
delta integer,
mtime timestamp without time zone,
filler character(22)
);
CREATE TABLE tellers (
tid integer NOT NULL,
bid integer,
tbalance integer,
filler character(84)
);
DBの初期化
initdb -E (文字コード)
DBの追加
createdb (hogehoge)
※通常はpostgresユーザーで行う
ユーザーの追加
createuser (hogehoge)
※こちらも通常はpostgresユーザーで行う
パスワードの変更方法
psql template1 -U postgres
ALTER USER (username) with password '(password)';
~/.pgpassに以下の書式でパスワードを保存するとログインをバイパスできる
hostname:port:database:username:password
但しパーミッションは600でなければならない。
チューニング
・work_mem は 4096
・1GBのメモリ搭載であれば512MB(536,870,912byte)割り当てをするとして
echo 536870912 >/proc/sys/kernel/shmmax
・max_connection が 100の場合
shared_buffers=ceil((536870912/1024-14.2*100-250)/8.2)=63734
となる
これで問題がなければ
/etc/sysctl.conf
に
kernel.shmmax = 536870912
を記述する
詳しくは
http://www.asahi-net.or.jp/~aa4t-nngk/pgsql5.htmlを参考にされたし。