時系列データ型を
つくってみた
ぬこ@横浜 (@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 でそれっぽいものを。
デモ
デモ(1)
h_int4 型を登録
h_int4 型カラムを持つテーブルを作成

id=2 の
id=3 の
id=3 の
id=4 の

4 件 INSERT
data を更新( 200→210 )
data を更新( 300→310 )
data を更新( 310→320 )
data を更新( 400→410 )

普通に SELECT
世代番号指定で SELECT
デモ(2)
id=4 の data を更新( 10 秒後に 410→420 )
id=4 の data を更新( 20 秒後に 420→430 )
普通に SELECT
10 秒後に SELECT
20 秒後に SELECT
デモ(図)
id = 1

100

id = 2

200

id = 3

300

id = 4

デモ環境
CentOS 6.3
PostgreSQL 9.3.2

400

INSERT

210
310

320

10 秒後 20 秒後
410

UPDATE

UPDATE

UPDATE

420

UPDATE

現世代

SELECT

前世代

430

UPDATE

UPDATE

直後

SELECT

t

10 秒後 20 秒後
トリガとの組み合わせ
トリガ関数
更新前の値と更新後の値を入力
更新後の値を更新前の値に追記
トリガ設定
BEFORE EACH ROWS /列トリガ
UPDATE test SET data = append(data, 100) WHERE …;
↓
UPDATE test SET data = 100 WHERE …;
今後
C 関数できちんと実装
可変長型への対応など
おしまい

More Related Content

PDF
20181122 pg con-jp-lt-logrep
PDF
Pythonによるソーシャルデータ分析―わたしはこうやって修士号を取得しました―
PDF
swirl パッケージでインタラクティブ学習
PPTX
東大生向けデータ解析講座 第1回 2017/12/27
PPTX
東大生向けデータ解析講座 第4回 2018/01/05
PDF
RとPythonによるデータ解析入門
PPTX
東大生向けデータ解析講座 第3回 2018/01/04
PPTX
東大生向けデータ解析講座 第2回 2017/12/29
20181122 pg con-jp-lt-logrep
Pythonによるソーシャルデータ分析―わたしはこうやって修士号を取得しました―
swirl パッケージでインタラクティブ学習
東大生向けデータ解析講座 第1回 2017/12/27
東大生向けデータ解析講座 第4回 2018/01/05
RとPythonによるデータ解析入門
東大生向けデータ解析講座 第3回 2018/01/04
東大生向けデータ解析講座 第2回 2017/12/29

What's hot (12)

PDF
TokyoR LT Rで連続データを離散化
PDF
二階堂愛と二階堂藍の違いについて
PPTX
Hash functions
PDF
トポロジカルデータ解析(仮)
PDF
NetworkXによる語彙ネットワークの可視化
PPTX
Rでプロット
PPTX
データ分析スクリプトのツール化入門 - PyConJP 2016
PPT
Twitterテキストのトピック分析
PPTX
クリスマス?
PDF
S09 t4 wrapup
PDF
Rでダイエット
PDF
Sapporo20140709
TokyoR LT Rで連続データを離散化
二階堂愛と二階堂藍の違いについて
Hash functions
トポロジカルデータ解析(仮)
NetworkXによる語彙ネットワークの可視化
Rでプロット
データ分析スクリプトのツール化入門 - PyConJP 2016
Twitterテキストのトピック分析
クリスマス?
S09 t4 wrapup
Rでダイエット
Sapporo20140709
Ad

More from Toshi Harada (20)

PDF
無駄にNeo4jを使っている日々
PDF
Pgunconf16 toast
PDF
Pgunconf14 pg13-psql
PDF
20190518 27th-chugoku db-lt-pg12
PDF
20190202-pgunconf-Access-Privilege-Inquiry-Functions
PDF
20190119 aws-study-pg-extension
PDF
20181110 fok2018-pg-extension
PDF
20171106 ntt-tx-postgre sql-10
PDF
20171103 pg con-jp-lt-plpgsql
PDF
20171028 osc-nagaoka-postgre sql-10
PDF
20170819 ocd-l tthon-pgdev
PDF
Ntt tx-study-postgre sql-10
PDF
Jpug study-postgre sql-10-pub
PDF
Chugoku db 20th-postgresql-10-pub
PDF
Pgconf asia-201612203-pg reversi-ja
PDF
Pgconf asia-201612203-pg reversi
PDF
Kof2016 postgresql-9.6
PDF
Chugoku db 17th-lt-kly
PDF
Chugoku db 17th-postgresql-9.6
PDF
Osc shimane-2016-do-postgres-dream-of-graph-database
無駄にNeo4jを使っている日々
Pgunconf16 toast
Pgunconf14 pg13-psql
20190518 27th-chugoku db-lt-pg12
20190202-pgunconf-Access-Privilege-Inquiry-Functions
20190119 aws-study-pg-extension
20181110 fok2018-pg-extension
20171106 ntt-tx-postgre sql-10
20171103 pg con-jp-lt-plpgsql
20171028 osc-nagaoka-postgre sql-10
20170819 ocd-l tthon-pgdev
Ntt tx-study-postgre sql-10
Jpug study-postgre sql-10-pub
Chugoku db 20th-postgresql-10-pub
Pgconf asia-201612203-pg reversi-ja
Pgconf asia-201612203-pg reversi
Kof2016 postgresql-9.6
Chugoku db 17th-lt-kly
Chugoku db 17th-postgresql-9.6
Osc shimane-2016-do-postgres-dream-of-graph-database
Ad

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