100日でPostgreSQLをマスター(17日目)~オブジェクト~

PostgreSQL
※アフィリエイト広告を利用しています

 

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の個性が出て面白いところですね。

部分インデックスは結構使えそうな気がしますが、実環境でも広く使われているのでしょうか。

今日はここまで。

 

<16日目 | 目次 | 18日目>

<<1日目から読む

Photo by Sneha Cecil on Unsplash

コメント

タイトルとURLをコピーしました