PostgreSQLの最近のブログ記事

ALTER TABLE tablename ALTER colname TYPE serial;
ERROR:  type "serial" does not exist
integerで定義したものを後からserialに変更することはできないようです。
そもそもserialは「型」ではなくて、「create tableする際のマクロというか呪文のようなもの」だからでしょうか。
(実際、CREATE TABLE文でserial型を指定したとき、作成された列の型はintegerになります。)

既存のカラムをserialに変更したい場合

既存の列をあとからserialにしたいときは、下記のように手動でシーケンスを作って対処するしかないようです。
CREATE SEQUENCE tablename_colname_seq;
ALTER TABLE tablename ALTER  colname SET DEFAULT nextval('tablename_colname_seq');
ALTER SEQUENCE tablename_colname_seq OWNED BY tablename.colname;
途中からシーケンスを使う場合は、連番の値を進めておくのを忘れずに。
例えば既存のデータの連番が100で終っている場合はこのようにします。
SELECT setval('tablename_colname_seq', 100);
詳細はシーケンスについての公式マニュアルをご覧ください。
http://www.postgresql.jp/document/current/html/datatype-numeric.html#DATATYPE-SERIAL
http://www.postgresql.jp/document/current/html/functions-sequence.html
psqlでビューの定義を見るときはこのようにします。
\d viewname
または
\d+ viewname
よくやりがちなのが、
\dv viewname
とやってしまって、「あれ?psqlのコマンドではビュー定義が見れないのか」と勘違いしてしまうことです。

"\dv"ではなく"\d"ですから!
text型のカラムをINTEGER型に変更しようとしたら、エラーが出ました。
ALTER TABLE tbl  ALTER COLUMN foo TYPE integer ;

ERROR:  column "foo" cannot be cast to type integer
こういう場合は、USING句を使って明示的に型変換してやる必要があるみたいです。
ALTER TABLE tbl ALTER COLUMN foo TYPE integer USING foo::int ;
これでうまく行きました。
参考
http://archives.postgresql.org/pgsql-admin/2009-08/msg00156.php
PostgreSQL Advent Calendar 25日目です。

/* ~ */ で複数行にわたるコメント

SQLでコメントを書くとき、"--"を使うのはよく知られています。

-- ここはコメントです。
-- ここもコメントです。

知らない人が結構いるのですが、/* ~ */ でブロックコメントを書くことができます。

こちらのスタイルの方が、C/Java/Javascript/PHP と同じなのでプログラマに優しいと思います。
これは標準SQL準拠です。

/*
 ここはコメント
 ここもコメント
 ここまでコメント 
*/
(これは、PostgreSQL Advent Calenderの企画記事です。)

PostgreSQLで、巨大なテーブル(例えばレコード数百万件~数千万件)にカラム追加・削除するときには注意が必要です。

カラム追加時にDEFAULTを設定しない


PHP/Perlをちょろっと書く程度しかできなかったウェブエンジニアの端くれの私が、経験したトラブルとそこで4ヵ月もかかって身に着けたことを紹介します。

PostgreSQLが重い!

とにかくWebサイトが重い。

.htmlのページはすぐ表示されるんだけど、.phpのページがやたらと重い。
夜のアクセスピーク時にはめっちゃ重い。

こんなことを経験する日が来るかもしれません。
そんなときに、おそるおそるLinuxサーバにログインしてなんとかやるしかないのが、ウェブエンジニアの端くれというものです。

(対応開始)

まずは負荷を調べる

[PostgreSQL]本当は怖いREINDEX

| カテゴリ:

稼動中のサービスでREINDEXをしてはいけません。

普通のWebサイトであれば、稼働中にREINDEXをやると、SELECT文がブロックされて応答が返ってこなくなります。

REINDEXはなぜ危険なのか

今日もスロークエリとたたかうプログラマのみなさんこんにちわ。
さて、ウェブ上でよく見かけるExplain Analyzeの解説記事では、

「スロークエリの遅い原因を調べてSQLを高速化しよう!」

と言うスローガンのもと、結局は

「seq scanを見つけたら、indexを貼ってindex scanするようにしましょう

という結論で終わっていることがほとんどです。

これは難しくない。

Indexを貼ってないテーブルにIndexを貼るのは誰でもできる。
そうやって一個一個seq scanをなくしていけば、たいていのSQLは高速化できるでしょう。

問題はここからです。
ベンチマークとか検証用で、まっさらのPostgreSQLをちゃちゃっと使いたいというときのマニュアルです。
※事前にPostgreSQL本体をインストールしておいてください。

やはりPostgreSQLはソースからコンパイルするのが一番です。(←くどい)
CentOS 5.6 + PostgreSQL 8.4のときと手順は全く同じです。

以下rootで作業します。
yum -y install readline readline-devel # 事前準備
wget ftp://ftp2.jp.postgresql.org/pub/postgresql/source/v9.1.1/postgresql-9.1.1.tar.gz
tar xvfz postgresql-9.1.1.tar.gz
cd postgresql-9.1.1
./configure
make  # コンパイル
make install # インストール

echo "PATH=/usr/local/pgsql/bin:\$PATH" >> /etc/profile # PATHを通しておきます。
adduser  postgres # 管理ユーザを作成
mkdir /usr/local/pgsql/data # データディレクトリを作成
chown postgres /usr/local/pgsql/data # オーナーを変更
su - postgres

以下、ユーザpostgresで作業します。
やはりPostgreSQLはソースからコンパイルするのが一番です。

以下rootで作業します。
yum -y install readline readline-devel # 事前準備
wget ftp://ftp2.jp.postgresql.org/pub/postgresql/source/v8.4.9/postgresql-8.4.9.tar.gz
tar xvfz postgresql-8.4.9.tar.gz
cd postgresql-8.4.9
./configure
make  # コンパイル
make install # インストール

echo "PATH=/usr/local/pgsql/bin:\$PATH" >> /etc/profile # PATHを通しておきます。
adduser  postgres # 管理ユーザを作成
mkdir /usr/local/pgsql/data # データディレクトリを作成
chown postgres /usr/local/pgsql/data # オーナーを変更
su - postgres

以下、ユーザpostgresで作業します。

MongoDB速すぎワロタw

いま巷で話題のMongoDB。
どれくらい速いのかと、insertのパフォーマンスをPostgreSQLと測定してみました。

結果はMongoDBの方が10倍以上速かったです。
まさに爆速!!
SELECT
  objname,
  to_char(pg_relation_size(objname::regclass), '999,999,999,999') as bytes
FROM (
  SELECT
    tablename as objname
  FROM pg_tables
  WHERE schemaname = 'public'

  UNION

  SELECT
    indexname as objname
  FROM pg_indexes
  WHERE schemaname = 'public'
  ) as objects

ORDER BY bytes DESC
このようなSQLはいちいち覚えてられないので、下記のようにビュー作成しておくのがオススメです。

pg_relation_size関数でエラー

| カテゴリ:
PostgreSQL 8.4から、pg_relation_sizeはtext型を受け付けなくなりました。

text型を引数に指定すると、こんなエラーが出ます。
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.

テーブルサイズを知りたいときは、regclassに型キャストしてあげましょう。

pg_relation_size(tablename::regclass)
pg_send_queryは非同期クエリ送信だから、結果を待たない分だけpg_queryより速いかと思ってベンチマークをとってみた。

日次集計などをするときに、日付の連続データを生成したいことがあります。

そんなときはgenerate_series関数を使います。

人気記事

このアーカイブについて

このページには、過去に書かれたブログ記事のうちPostgreSQLカテゴリに属しているものが含まれています。

前のカテゴリはMongoDBです。

次のカテゴリはRailsです。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

最近の人気記事