次のような数値:
0.000000000000000000000000000000000000000123456
postgres で使用可能な数値型を使用して、パフォーマンスを大幅に低下させずに格納することは困難です。この質問は同様の問題に対処していますが、受け入れられる解決策に達したとは思いません。現在、私の同僚の 1 人は、このような数値を小数点以下 15 桁に丸め、次のように格納することにしました。
0.000000000000001
倍精度数値型を使用できるようにすることで、10 進数値型への移行に伴うペナルティを回避できます。私の目的にとってこのように小さい数値は、どちらも非常に小さい (そしてほぼ同じことを意味する) ため、多かれ少なかれ機能的に同等です。ただし、これらの結果をグラフ化しており、データセットの大部分がこのように丸められると、非常に愚かに見えます (グラフの平らな線)。
これらの数値を何万も保存して操作しているため、10 進数の数値型はパフォーマンスのペナルティが大きすぎるため、適切なオプションではありません。
私は科学者であり、これらの種類の数値を科学表記法で保存するのが私の自然な傾向ですが、postgres にこの種の機能があるようには見えません。実際には数値のすべての精度は必要ありません。4桁程度を保持したいだけなので、float数値型が提供する15桁も必要ありません。これらの数値を次のように 2 つのフィールドに格納することの利点と欠点は何ですか。
1.234 (real)
-40 (smallint)
これは 1.234*10^-40 に相当しますか? これにより、最大 32000 の先頭の 10 進数を格納するために使用される 2 バイトと実際の値を格納するために 4 バイトのみが使用され、数値ごとに合計で最大 6 バイトになります (格納したい正確な数値が得られ、 8 バイトを消費する既存のソリューション)。また、最初に smallint フィールドをソートし、次に real フィールドをソートするだけでよいため、これらの数値のソートは大幅に改善されるようです。