時系列データ型を
つくってみた
ぬこ@横浜 (@nuko_yokohama)
みなさん、こんにちは
楽しい
PostgreSQL 拡張作成ライフを
お過ごしでしょうか?
今回のテーマ
時系列データ型
あるカラムがいつの時点で
どういった値だったのかを
知りたいときって
ありませんか。
ありませんかそうですか。 (´ ・ ω ・` )
ということで、
役に立つのかどうかは不明だが
そんなデータ型をなんとなく
作ってみたくなったので
作ってみた。
ということで、
役に立つのかどうかは不明だが
そんなデータ型をなんとなく
作ってみたくなったので
作ってみた。
コンセプト
データ型に時系列を加えてみる
列値に履歴情報を持つ。
きちんと拡張すれば監査とかに使えるかも?
時系列データ型の実装
・履歴追記データ型 (int4 用 )
型に対する入出力関数
今回は整数型のプロトタイプを作成する。
可変長データ型になると少し面倒。
データタイプ名: h_int4
ヘッダ(世代数、最終更新タイムスタンプ)
エントリ(タイムスタンプ、データ実体)
→ 監査目的にするなら、ユーザ情報...
こんな感じ
ヘッダ
世代数

最終更新タイムスタンプ

エントリ
タイムスタンプ

データ実体 (INT)

タイムスタンプ

データ実体 (INT)

世代数分、繰り返し

データ実体が可変長の場合は、各エントリの長さ情報も
エントリ内のヘッ...
型に対する入出力関数
・入力:入力値から 1 世代分の履歴型を
 生成して追加
・出力:最新の世代の値を取り出し
・バイナリ入力:必要か?
・バイナリ出力:トリガで必要か?
型に関する操作関数(1)
・世代数取得
・全ヒストリの取得
・世代番号指定による取り出し
・タイムスタンプによる取り出し
・タイムスタンプに一番近い過去のもの
・タイムスタンプに一番近い未来のもの
・世代の消去(最新世代のみを残す)
型に関する操作関数(2)
・タイムスタンプ指定つきの履歴追加
 ※未来の時刻と値を事前にセットする
未来のタイムスタンプを指定して、一定時間を過ぎると勝手に
値が変わる機能があると嬉しかったりするだろうか?
この場合、デフォルトの評価値が最新世...
型に関する演算関数
・通常の四則演算関
  (add/sub/mul/div/mod)
・集約演算関数
 ( SUM/MAX/MIN など)
インデックス?

・対応できるかどうか微妙。
・というか型の変動性分類上、
 対応できない気がする・・・。
関数の変動性分類
そもそも、こういう型を評価する関数の
変動性分類はどうなるのか。
Immutable/Stable とは言えないか・・・。
→ フツーに考えると volatile に分類すべきなんだろかなあ。
最適化や関数インデクスのことを考...
デモ向け実装
・時間がなくて C 関数できちんと実装
 できなかった・・・
・今回はプロトタイプということで
  PL/pgSQL でそれっぽいものを。
デモ
デモ(1)
h_int4 型を登録
h_int4 型カラムを持つテーブルを作成

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

4 件 INSERT
data を更新( 200→210 )
data を更新( 300→310 )
d...
デモ(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...
トリガとの組み合わせ
トリガ関数
更新前の値と更新後の値を入力
更新後の値を更新前の値に追記
トリガ設定
BEFORE EACH ROWS /列トリガ
UPDATE test SET data = append(data, 100) WHERE...
今後
C 関数できちんと実装
可変長型への対応など
おしまい
Upcoming SlideShare
Loading in …5
×

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

824 views
694 views

Published on

PostgreSQL Unconference 2014/01/18

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
824
On SlideShare
0
From Embeds
0
Number of Embeds
13
Actions
Shares
0
Downloads
1
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

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

  1. 1. 時系列データ型を つくってみた ぬこ@横浜 (@nuko_yokohama)
  2. 2. みなさん、こんにちは 楽しい PostgreSQL 拡張作成ライフを お過ごしでしょうか?
  3. 3. 今回のテーマ 時系列データ型
  4. 4. あるカラムがいつの時点で どういった値だったのかを 知りたいときって ありませんか。 ありませんかそうですか。 (´ ・ ω ・` )
  5. 5. ということで、 役に立つのかどうかは不明だが そんなデータ型をなんとなく 作ってみたくなったので 作ってみた。
  6. 6. ということで、 役に立つのかどうかは不明だが そんなデータ型をなんとなく 作ってみたくなったので 作ってみた。
  7. 7. コンセプト データ型に時系列を加えてみる 列値に履歴情報を持つ。 きちんと拡張すれば監査とかに使えるかも?
  8. 8. 時系列データ型の実装 ・履歴追記データ型 (int4 用 )
  9. 9. 型に対する入出力関数 今回は整数型のプロトタイプを作成する。 可変長データ型になると少し面倒。 データタイプ名: h_int4 ヘッダ(世代数、最終更新タイムスタンプ) エントリ(タイムスタンプ、データ実体) → 監査目的にするなら、ユーザ情報も格納すべき? (今回は追加していない)
  10. 10. こんな感じ ヘッダ 世代数 最終更新タイムスタンプ エントリ タイムスタンプ データ実体 (INT) タイムスタンプ データ実体 (INT) 世代数分、繰り返し データ実体が可変長の場合は、各エントリの長さ情報も エントリ内のヘッダに必要になる。ちょい面倒。 (ヘッダ部にインデックス的な情報も必要かも)
  11. 11. 型に対する入出力関数 ・入力:入力値から 1 世代分の履歴型を  生成して追加 ・出力:最新の世代の値を取り出し ・バイナリ入力:必要か? ・バイナリ出力:トリガで必要か?
  12. 12. 型に関する操作関数(1) ・世代数取得 ・全ヒストリの取得 ・世代番号指定による取り出し ・タイムスタンプによる取り出し ・タイムスタンプに一番近い過去のもの ・タイムスタンプに一番近い未来のもの ・世代の消去(最新世代のみを残す)
  13. 13. 型に関する操作関数(2) ・タイムスタンプ指定つきの履歴追加  ※未来の時刻と値を事前にセットする 未来のタイムスタンプを指定して、一定時間を過ぎると勝手に 値が変わる機能があると嬉しかったりするだろうか? この場合、デフォルトの評価値が最新世代のもの、ではなく カレントタイムスタンプより過去のものとかいう評価が必要
  14. 14. 型に関する演算関数 ・通常の四則演算関   (add/sub/mul/div/mod) ・集約演算関数  ( SUM/MAX/MIN など)
  15. 15. インデックス? ・対応できるかどうか微妙。 ・というか型の変動性分類上、  対応できない気がする・・・。
  16. 16. 関数の変動性分類 そもそも、こういう型を評価する関数の 変動性分類はどうなるのか。 Immutable/Stable とは言えないか・・・。 → フツーに考えると volatile に分類すべきなんだろかなあ。 最適化や関数インデクスのことを考えると微妙なことになる。 → 検索条件となりうるカラムに使うのは難しいかも (別にインデクス検索されるカラムがあり、 その後の Filter 句として使うくらいか)
  17. 17. デモ向け実装 ・時間がなくて C 関数できちんと実装  できなかった・・・ ・今回はプロトタイプということで   PL/pgSQL でそれっぽいものを。
  18. 18. デモ
  19. 19. デモ(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
  20. 20. デモ(2) id=4 の data を更新( 10 秒後に 410→420 ) id=4 の data を更新( 20 秒後に 420→430 ) 普通に SELECT 10 秒後に SELECT 20 秒後に SELECT
  21. 21. デモ(図) 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 秒後
  22. 22. トリガとの組み合わせ トリガ関数 更新前の値と更新後の値を入力 更新後の値を更新前の値に追記 トリガ設定 BEFORE EACH ROWS /列トリガ UPDATE test SET data = append(data, 100) WHERE …; ↓ UPDATE test SET data = 100 WHERE …;
  23. 23. 今後 C 関数できちんと実装 可変長型への対応など
  24. 24. おしまい

×