速いアプリケーションの作り方でPostgreSQLのRETURNING句に軽く触れましたが、この機能はデータベースチューニングで強力なツールになる場合があります。知って得する、知らなければ損をする、そんな機能がRETURNING句です。
RETRUNING句とは?
RETURNING句とはPostgreSQLの独自拡張でINSERT/UPDATE/DELETE文で結果を返す機能です。PostgreSQL 8.2から利用できます。文の最後に”RETURNING カラム名, …”の形式で返すカラムを指定します。ワイルドカード(*)も指定可能です。
INSERT (column) VALUES (1234) RETURNING column1, column2, ...
初めて見る方は更新系のSQLクエリで結果を返す?なんだそれは?と思うかも知れません。しかし、これがかなり強力です。
例えば、Webシステムのセッションデータベースを作る場合、作成時刻、更新時刻、アクセス時刻、アクセス回数、所有者、セッションデータなどを記録するでしょう。
CREATE TABLE session ( id text PRIMARY KEY, created timestamp NOT NULL DEFAULT now(), accessed timestamp NOT NULL DEFAULT now(), owner text, data text NOT NULL DEFAULT '' );
セッションデータの管理
セッションデータに更新がなければ、データを保存する必要はありません。データを保存する必要がなくても、使われなくなったセッションデータを掃除するために最終利用時刻は更新する必要があります。PostgreSQL以外のデータベースでは
- SELECTでセッションデータを取得(SELECT * FROM session WHERE id = ‘セッションID’)
- UPDATEで最終利用時刻を更新(UPDATE session SET accessed = now() WHERE id = ‘セッションID’)
としなければなりません。データの取得と更新を同時に行えるPostgreSQLなら
- UPDATEでセッションデータを取得&最終利用時刻を更新(UPDATE session SET accessed = now() WHERE id = ‘セッションID’ RETURNING owner, data)
と一度のクエリで済みます。
セッションデータがあまり変わらないWebアプリケーションならデータベースへのクエリ数をほぼ半減できます。
まとめ
RETURNING句を利用すると更新系クエリでSELECTと同じ動作を同時に実行できます。これを上手く利用すると、セッションデータの管理のようにデータベースクエリの回数を半減できます。
データベースクエリ回数の削減はデータベース性能に直接影響します。PostgreSQLのRETURNING句を上手く利用して、パフォーマンスを向上させましょう。
Leave a Comment