24
時系列データ型を つくってみた ぬこ@横浜 (@nuko_yokohama)

時系列データ型(Int4)をつくってみた

Embed Size (px)

DESCRIPTION

PostgreSQL Unconference 2014/01/18

Citation preview

時系列データ型をつくってみた

ぬこ@横浜 (@nuko_yokohama)

みなさん、こんにちは

楽しいPostgreSQL 拡張作成ライフを

お過ごしでしょうか?

今回のテーマ

時系列データ型

あるカラムがいつの時点でどういった値だったのかを

知りたいときってありませんか。

ありませんかそうですか。 (´ ・ω ・` )

ということで、役に立つのかどうかは不明だがそんなデータ型をなんとなく

作ってみたくなったので作ってみた。

ということで、役に立つのかどうかは不明だがそんなデータ型をなんとなく

作ってみたくなったので作ってみた。

コンセプトデータ型に時系列を加えてみる

列値に履歴情報を持つ。

きちんと拡張すれば監査とかに使えるかも?

時系列データ型の実装

・履歴追記データ型 (int4 用 )

今回は整数型のプロトタイプを作成する。可変長データ型になると少し面倒。

データタイプ名: h_int4

ヘッダ(世代数、最終更新タイムスタンプ)

エントリ(タイムスタンプ、データ実体)→ 監査目的にするなら、ユーザ情報も格納すべき?

(今回は追加していない)

型に対する入出力関数

世代数 最終更新タイムスタンプ

タイムスタンプ データ実体 (INT)

ヘッダ

エントリ

タイムスタンプ データ実体 (INT)

世代数分、繰り返し

こんな感じ

データ実体が可変長の場合は、各エントリの長さ情報もエントリ内のヘッダに必要になる。ちょい面倒。(ヘッダ部にインデックス的な情報も必要かも)

・入力:入力値から 1 世代分の履歴型を 生成して追加・出力:最新の世代の値を取り出し・バイナリ入力:必要か?・バイナリ出力:トリガで必要か?

型に対する入出力関数

・世代数取得・全ヒストリの取得・世代番号指定による取り出し・タイムスタンプによる取り出し・タイムスタンプに一番近い過去のもの・タイムスタンプに一番近い未来のもの・世代の消去(最新世代のみを残す)

型に関する操作関数(1)

・タイムスタンプ指定つきの履歴追加 ※未来の時刻と値を事前にセットする

未来のタイムスタンプを指定して、一定時間を過ぎると勝手に値が変わる機能があると嬉しかったりするだろうか?

この場合、デフォルトの評価値が最新世代のもの、ではなくカレントタイムスタンプより過去のものとかいう評価が必要

型に関する操作関数(2)

型に関する演算関数

・通常の四則演算関  (add/sub/mul/div/mod)・集約演算関数 ( SUM/MAX/MIN など)

インデックス?

・対応できるかどうか微妙。・というか型の変動性分類上、 対応できない気がする・・・。

関数の変動性分類そもそも、こういう型を評価する関数の

変動性分類はどうなるのか。Immutable/Stable とは言えないか・・・。

→ フツーに考えると volatile に分類すべきなんだろかなあ。

最適化や関数インデクスのことを考えると微妙なことになる。→ 検索条件となりうるカラムに使うのは難しいかも

(別にインデクス検索されるカラムがあり、その後の Filter 句として使うくらいか)

デモ向け実装

・時間がなくて C 関数できちんと実装 できなかった・・・・今回はプロトタイプということで  PL/pgSQL でそれっぽいものを。

デモ

h_int4 型を登録h_int4 型カラムを持つテーブルを作成

4 件 INSERTid=2の data を更新( 200→210)id=3 の data を更新( 300→310)id=3 の data を更新( 310→320)id=4 の data を更新( 400→410)

普通に SELECT世代番号指定で SELECT

デモ(1)

id=4 の data を更新( 10 秒後に 410→420)id=4 の data を更新( 20 秒後に 420→430)

普通に SELECT10 秒後に SELECT20 秒後に SELECT

デモ(2)

デモ(図)

100id = 1

200id = 2

300id = 3

400id = 4

INSERT UPDATE

210

310 320

410 420 430

10 秒後 20 秒後

tUPDATE UPDATE UPDATE UPDATE UPDATESELECT SELECT

10 秒後 20 秒後直後現世代 前世代

デモ環境CentOS 6.3

PostgreSQL 9.3.2

トリガ関数更新前の値と更新後の値を入力更新後の値を更新前の値に追記

トリガ設定BEFORE EACH ROWS/列トリガ

トリガとの組み合わせ

UPDATE test SET data = append(data, 100) WHERE …;↓

UPDATE test SET data = 100 WHERE …;

今後C 関数できちんと実装可変長型への対応など

おしまい