![](https://yuki-engineer-blog.com/wp-content/themes/cocoon-master/images/b-man.png)
Yukiです。
今日はオブジェクトについて、PostgreSQL独自の部分を中心に勉強します。
オブジェクト
部分インデックス
一部の値だけ載せたインデックスです。
例えばchar型の列で、ほとんど’0’だけど、少しだけ’1’があるといったときに、インデックスで’0’の行を検索しても早くならないですよね。部分インデックスでは、インデックスの効果がある’1’だけを載せることができます。’0’のデータを格納する領域も使わないので、ディスク容量の節約にもなります。
例)
CREATE INDEX table1_index1 ON table1 (col1) WHERE co1 = '1';
ルール
ルールを使うとSQLを置き換えたり、処理を付け足したりできます。ちなみに、ビューもルールを利用しているそうです。と言われてもピンと来ないかもしれません。
具体例を見たほうが早いですね。
例えば、ログ用のテーブルを作れます。
table1のログ用のテーブルとして、table1_logを作るとします。
table1にINSERTしたとき、時刻とともにINSERTした内容をtable1_logに挿入するとして、以下のルールを作ります。
CREATE RULE table1_log_insert AS ON INSERT TO table1 DO ALSO INSERT INTO table1_log VALUES (new.col1, new.col2, ..., now());
※table1には、col1, col2, …と列が定義してあるものとします。
「DO ALSO」なので、処理を付け足すほうです。
一方で、「DO INSTEAD 」では、SQLを置き換えます。
あれ、これはトリガーを使う場合と比べて、何かメリットはあるのでしょうか?
スキーマ
スキーマはOracleにもありますね。
ただ、Oracleの方が特殊で、スキーマとユーザが1対1になっていますね。しかもスキーマ名=ユーザ名です。
PostgreSQLにはそのような縛りはありません。
では、SQLを書くときにスキーマ名を省略するとどうなるのでしょうか? PostgreSQLでは、search_pathパラメータに従って、スキーマを検索します。
例えば、search_pathパラメータに「schema1, “$user”, public」と設定されている場合、「schema1」スキーマ、ユーザ名と同じスキーマ、publicスキーマの順にオブジェクトを検索します。なお、publicスキーマの設定を忘れると、publicスキーマにある関数がスキーマ指定なしで使えなくなるので、指定した方が吉です。
関数
関数を定義するときの書式は覚えておいた方がよさそうです。
CREATE [OR REPLACE] FUNCTION <関数名>(<引数>, ...) RETURNS [SETOF] <戻り値> AS $$ ~関数の記述~ $$ LANGUAGE <使用言語>;
- 既存の関数があった場合にエラーとせずに置き換えるには「OR REPLACE」を指定します。
- 複数の値を返す場合は「SETOF」を指定します。
- $$~$$の間に関数を記述します。
- 使用言語には、SQLのほか、OracleのPL/SQLみたいに逐次処理が書けるPL/pgSQLや、PL/PerlやPL/Pythonなんかも使えるようです。
まとめ
今日はオブジェクトについて学びました。
いろいろとDBMSの個性が出て面白いところですね。
部分インデックスは結構使えそうな気がしますが、実環境でも広く使われているのでしょうか。
今日はここまで。
Photo by Sneha Cecil on Unsplash
コメント