知って得するPostgreSQLのRETURNING句

Database, Development 12月 19, 2014 #PostgreSQL
(Last Updated On: 2018年8月13日)

速いアプリケーションの作り方で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以外のデータベースでは

  1. SELECTでセッションデータを取得(SELECT * FROM session WHERE id = ‘セッションID’)
  2. UPDATEで最終利用時刻を更新(UPDATE session SET accessed = now() WHERE id = ‘セッションID’)

としなければなりません。データの取得と更新を同時に行えるPostgreSQLなら

  1. UPDATEでセッションデータを取得&最終利用時刻を更新(UPDATE session SET accessed = now() WHERE id = ‘セッションID’ RETURNING owner, data)

と一度のクエリで済みます。

セッションデータがあまり変わらないWebアプリケーションならデータベースへのクエリ数をほぼ半減できます。

 

まとめ

RETURNING句を利用すると更新系クエリでSELECTと同じ動作を同時に実行できます。これを上手く利用すると、セッションデータの管理のようにデータベースクエリの回数を半減できます。

データベースクエリ回数の削減はデータベース性能に直接影響します。PostgreSQLのRETURNING句を上手く利用して、パフォーマンスを向上させましょう。

 

 

投稿者: yohgaki