Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
時系列データ型を
つくってみた
ぬこ@横浜 (@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)をつくってみた

1,041 views

Published on

PostgreSQL Unconference 2014/01/18

Published in: Technology
  • Be the first to comment

  • Be the first to like this

時系列データ型(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. おしまい

×