データベース


2011年11月10日

Accessで外部データ取り込みする場合の制約?

Accessで外部データ取り込みする場合の注意点

知らないとハマるので要注意。

1.csvなどを取り込む場合には、末尾に半角のスペースが含まれる場合には切り詰められてしまう。=Accessを通じてインポートとエクスポートだけをした場合には列ごとの末尾の半角スペースの情報は失われる。

2.最後の列の値がどの行もnullだった場合には列として認識されない。=インポート時に列を追加してあげる必要がある。

2009年11月30日

インピーダンスミスマッチ

「オブジェクト指向設計」と「リレーショナルデータベース設計」の設計思想の違いから発生するミスマッチ。そのためにO/Rマッピングが存在する。

連載:Hibernateで理解するO/Rマッピング(1)

2007年2月28日

LIMITとOFFSETがSQL92準拠ではない??

今日、Oracle 10gのiSQL*PlusからSQLを発行していたときにPostgreSQLで実行していたときと同じようにLIMIT句をSELECT文の最後に付けて発行したらなぜかエラーになった。
LIMITなんてしらねーよって。。。。

ま、まさかLIMITがSQL標準ではないのか??と思って探したら、やはりSQL標準ではないようです。(最後のほうに載っています)

PostgreSQLではランダムに取り出す ORDER BY random()というユーザー定義関数を使った並び替えもできるのだが、PostgreSQLに慣れるとどれが標準なのかわからずに使ってしまい、結果的に危ないかも。。。

でも確か、LIMITはMySQLでも使えたはずだから、事実上の標準であり、ただしOracleは対応していないと考えることもできるのかもしれない??

2007年2月12日

phpMyAdmin

phpMyAdminはVer.2.8.2以前と以降では認証方法が変わったらしい。特にデータベースへアカウント情報を保持しなければならなくなったので、少しは面倒になったようだ。

セキュリティ上の問題があるVer.2.7.0plを使う場合には、Basic認証等の何らかの第三者に使われないような仕組みを別途用意すべきだろう。旧バージョンはSourceForge.netからダウンロードできる。

2006年11月20日

PL/PHP

PostgreSQLのストアドプロシージャPL/PHPに関する説明。アプリケーションサーバーとDBサーバー間でのオーバーヘッドが無視できない状況においては、検討する価値は十分あるだろう。

2006年11月 6日

COALESCE

取り出したデータが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を日ごろ利用している人でも一見の価値があると思う。

2006年10月23日

pgpool-II

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)っておそらく反則だと思います。そうそうこんな環境は用意できませんから。

2006年10月 2日

PostgreSQLのエンタープライズ環境

PostgreSQLには高可用性と負荷分散に関する製品が存在するが、いずれもフリーだ。メリットとデメリットは以下のとおり。

Slony-I(スローニーワン)

シングルマスターマルチスレーブ方式。メリットはクラスター数に制限が無いこと。クラスター数を増やしても負荷が増えない(スレーブのスレーブにもできる)こと。デメリットはマスターからのコピー時間を制限できないこと。このことによりスレーブ間に時差が発生することがある。

pgpool(ピージープール)

マルチマスター方式。メリットは仕組みが非常に簡単(クエリを単純に自分自身とスレーブに投げるだけ)。デメリットはクラスター数が2台まで。完全にノード間が同じ状態であるか(クエリーエラーを考慮しないので、マスターとスレーブが同期されない可能性がある)は保証されない。

PGCluster(ピージークラスター)

マルチマスター方式。メリットはクラスター数に制限が無いこと。

クエリを負荷に応じて分散するロードバランサー、更新系クエリを他のノードにコピーしてクラスター間が正しい状態かどうかを監視するレプリケーション、そしてクラスターの最低3台が必要。もちろんすべてを1台で兼ねることもできるが、何ら意味は無い。

デメリットは、クラスターが増えるとノードすべてにコピーを反映させるのに時間がかかるようになり、指数関数的に待ち時間が増える(もちろん選択系クエリはクラスタが多いほうが早い)こと。負荷が多くなるとなぜかコピーが正常に行えない問題などがある。

おそらく選択系クエリと更新系クエリのどちらの頻度が多いかによって選ぶべきなのだろうと思われる。

続きを読む "PostgreSQLのエンタープライズ環境" »

2006年7月10日

DMLとDDL

DML(Data Manipulation Language)
SELECT, INSERT, UPDATE, DELETEなどレコードの追加や変更、削除に使われるSQL言語

DDL(Data Definition Language)
CREATE, ALTER, DROPなどテーブルの追加や変更、削除に使われるSQL言語

2006年4月 8日

SQLite

SQLiteを試してみました。
PHP5からはデフォルトで入っていますが、Windows上で実行する場合には
cgi.force_redirect=0
を設定(IISの場合)し、
extension=php_pdo.dll
extension=php_sqlite.dll
を有効にする必要があります。
もしコンソールからSQLiteを実行する場合には
http://www.sqlite.org/download.html
からダウンロードしますが、PHPのサポートは SQLite 2です。SQLite 2 と 3 では互換性が残念ながらありません。

2006年4月 5日

postgres.confの別の見解

postgres.confの設定のやり方に別の見解が載っていたので紹介する。
・share_bufferは大きくとりすぎないで10000程度にする。
・effective_cache_size 32768
・random_page_cost 3
・wal_sync_methodをいろいろと変更してみる
詳しくは
http://www.thinkit.co.jp/cert/marugoto/2/1/11/2.htm

2006年3月31日

PostgreSQLのロックについて

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

2006年3月30日

Common SQL Environment

こんなソフトがあるらしい。GUIベースでSQLが発行できます。さまざまなデータベースに対応していて、便利なソフトウエア。ただ、最近はWebでSQLが発行できるphpPgAdminやphpMyAdminなどがあるので、あまり使われない? - ダウンロードはこちら

pgbench

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)
);

pgbench -i bench で作成されるみたいだ。

2006年3月28日

PostgreSQLインストール

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を参考にされたし。