PostgreSQL 9.0.4文書 | ||||
---|---|---|---|---|
前のページ | 巻戻し | 付録 F. 追加で提供されるモジュール | 早送り | 次のページ |
本モジュールは線分、浮動小数点区間を表現するsegデータ型を実装します。 segは区間の終端内の不確定性を表すことができ、特に実験計測の表現に有用です。
計測の幾何は数値の連続におけるものより通常より複雑です。 計測は通常、多少あいまいな制限を持つ連続の部分部分となります。 不確実性と不規則性のため、さらに、プロテインを安定させる温度範囲など計測される値は本質的に何らかの状態を示す区間となる可能性があるため、計測は区間として表れます。
一般的な見方を使うと、こうしたデータは値の組合せではなく区間としてデータを格納する方が便利なようです。 実際、ほとんどのアプリケーションでより効率的であると判明してさえいます。
一般的な見方をさらに進めると、制限の曖昧さは、伝統的な数値データ型を使用することで情報がある程度損失してしまうことを暗示しています。 これを考えてみましょう。 計測機器で6.50と読み取り、読み取ったデータをデータベースに格納します。 それを取り出す時にどうなるでしょう。 見てみましょう。
test=> select 6.50 :: float8 as "pH"; pH --- 6.5 (1 row)
計測という世界では6.50は6.5と同じではありません。 時としてこれが致命的な違いになる場合があります。 実験者は信頼する桁を書き出し(公開し)ます。 6.50は実質それ以上の値を含むあいまいな区間であり、(おそらく)その分布におけるもっとも特徴的なものを中央値として持つ6.5という区間よりもあいまいです。 私達は厳密にこうした異なるデータ項目が同じものとして現れることを好みません。
まとめ? 任意の可変精度を持つ区間の制限を記録できる特別なデータ型を持つことは素晴らしいことでしょう。 変数はある意味、各データ要素が独自の精度を持ちます。
以下を見てください。
test=> select '6.25 .. 6.50'::seg as "pH"; pH ------------ 6.25 .. 6.50 (1 row)
区間の外部表現は、1つまたは2つの浮動小数点値を範囲演算子(..または...)で結び付けた形になります。 他にも、中央値と正負の偏差として指定することも可能です。 省略可能な確実性指示子(<、>、~)を格納することもできます。 (しかし、確実性指示子はすべての組込みの演算子で無視されます。) 表F-24に許される表現についての概要を、表F-25にいくつか例を示します。
表F-24では、x、y、deltaは浮動小数点数値を表します。 delta以外のxとyの前に確実性指示子を付与することができます。
表 F-24. seg外部表現
x | 単一値(幅0の区間) |
x .. y | xからyまでの区間 |
x (+-) delta | x - deltaからx + deltaまでの区間 |
x .. | 下限値xを持つ閉じていない区間 |
.. x | 上限値xを持つ閉じていない区間 |
表 F-25. 有効なSEG入力の例
5.0 | 幅0のセグメントを作成します(こうすると点になります)。 |
~5.0 | 幅0のセグメントを作成し、データ内に~を記録します。 ~はseg型の演算では無視されますが、コメントとして保持されます。 |
<5.0 | 5.0という点を作成します。 <は無視されますが、コメントとして保持されます。 |
>5.0 | 5.0という点を作成します。 >は無視されますが、コメントとして保持されます。 |
5(+-)0.3 | 4.7 .. 5.3という区間を作成します。 (+-)という記述は保持されないことに注意してください。 |
50 .. | 50以上のすべて |
.. 0 | 0以下のすべて |
1.5e-2 .. 2E-2 | 0.015 .. 0.02という区間を作成します |
1 ... 2 | 1...2、1 .. 2、1..2と同じです(範囲演算子前後の空白は無視されます)。 |
データソースで...が広く使用されるため、..の代わりの綴りとして許可されています。 残念なことにこれにより解析上の曖昧性が生じました。 0...23の上限が23なのか0.23なのかが明確ではありません。 これは、segの入力において、少なくとも1つの桁を数値内の小数点の前に書くことを要求することで解決されます。
健全性検査としてsegは、5 .. 2のような、下限値が上限値より大きな区間を拒絶します。
内部的にseg値には32ビット浮動小数点数値の組合せが格納されます。 これは7桁以上の有効桁を持つ数値が切り詰められることを意味します。
有効桁が正確に7桁、または7桁未満の数値は元の精度が保たれます。 つまり、問い合わせが0.00を返す場合、最後の0が書式付けのための誤差にならないことが確実です。 これは元のデータの精度を反映します。 最初から続く0は精度の影響を受けません。 0.0067は2有効桁のみを持つものと考えられます。
segモジュールにはseg値用のGiSTインデックス演算子クラスが含まれます。 GiST演算子クラスでサポートされる演算子を表F-26に示します。
表 F-26. Seg GiST演算子
演算子 | 説明 |
---|---|
[a, b] << [c, d] | [a, b]が完全に[c, d]の左側に存在します。 つまり、b <cならば[a, b] << [c, d]は真です。 さもなくば偽です。 |
[a, b] >> [c, d] | [a, b]が完全に [c, d]の右側に存在します。 つまり、a > dならば[a, b] >> [c, d]は真、さもなくば偽です。 |
[a, b] &< [c, d] | 重なるまたは左側。 これは"右側にはみださない"ととらえた方がいいかもしれません。 b <= dならば真です。 |
[a, b] &> [c, d] | 重なるか右側。 これは"左側にはみださない"ととらえた方がいいかもしれません。 a >= cならば真です。 |
[a, b] = [c, d] | 同一。 セグメント[a, b]と [c, d]が同一、つまり、a == bかつc == dです。 |
[a, b] && [c, d] | セグメント[a, b]と[c, d]に重なりがあります。 |
[a, b] @> [c, d] | セグメント[a, b]はセグメント[c, d]を含有します。つまり、a <= cかつb >= dです。 |
[a, b] <@ [c, d] | セグメント[a, b]はセグメント[c, d]に含有されます。つまり、a >= cかつb <= dです。 |
(PostgreSQL 8.2以前では、含有演算子@>および<@はそれぞれ@および~という名前でした。 以前の名前もまだ利用できますが、廃止予定であり、いずれなくなります。 以前の名前は、コアの幾何データ型で以前従っていた規約と反対であることに注意してください。)
以下の例のように、標準B-Tree演算子も提供されます。
これらの演算子はソート以外の実用的な目的に対して大きな意味を持ちません。 これらの演算子はまず(a)と(c)を比べ、等しければ(b)と(d)を比べます。 論理的にはほとんどの場合優れたソート処理と思えます。 こうした型をORDER BYで使用したい場合に有用です。使用方法の例はリグレッション試験のsql/seg.sqlを参照してください。
(+-)を通常の範囲に変換する機構は、境界で有効な桁数を決定するという点で完全に正確ではありません。 例えば以下のように、結果の区間に10の冪乗が含まれる場合、下限値に余計な桁を追加します。
postgres=> select '10(+-)1'::seg as seg; seg --------- 9.0 .. 11 -- should be: 9 .. 11
R-Treeインデックスの性能は入力値の初期の順序に大きく依存する可能性があります。 seg列で入力テーブルをソートすることは非常に役に立つでしょう。 例としてsort-segments.plスクリプトを参照してください。
原作者:Gene Selkov, Jr. <selkovjr@mcs.anl.gov>
,
Mathematics and Computer Science Division, Argonne National Laboratory.
GiST (http://gist.cs.berkeley.edu/)の要旨(gist)を説明していただいたJoe Hellerstein博士(http://db.cs.berkeley.edu/jmh/)に感謝します。 また、自分の世界を作成できるようにし、静かに生活できるようにしてもらった、過去から現在までのすべてのpostgres開発者に感謝します。 データベース研究に長年誠実にサポートしてくれたArgonne LabとU.S. Department of Energyにも感謝します。