число, например:эффективно хранить десятичных чисел со многими ведущими Нули в Postgresql
0.00000000000000000000000000000000000000
трудно хранить без большой производительности штрафа с имеющимися числовыми типами в Postgres. Этот question адресует аналогичную проблему, но я не чувствую, что она дошла до приемлемого разрешения. В настоящее время один из моих коллег приземлилась на округление чисел, как это до 15 знаков после запятой и просто хранить их как:
0.000000000000001
Так что двойная точность числового типа может быть использован, который предотвращает наказание, связанное с переходом к десятичному числовому типу , Числа, которые являются такими маленькими для моих целей, более или менее функционально эквивалентны, потому что они оба очень маленькие (и означают более или менее одно и то же). Тем не менее, мы рисуем эти результаты, и когда большая часть набора данных будет округлена, это выглядит исключительно глупо (плоская линия на графике).
Поскольку мы храним десятки тысяч этих чисел и действующих на них, десятичный числовой тип не является хорошим вариантом для нас, как штраф производительность слишком велик.
Я ученый, и мой естественный склон был бы просто хранить эти типы чисел в научной нотации, но не кажется, что postgres обладает такой функциональностью. Мне действительно не нужна вся точность в числе, я просто хочу сохранить 4 цифры или около того, поэтому мне даже не нужны 15 цифр, которые предлагает тип чисел с плавающей точкой. Каковы преимущества и недостатки хранения этих чисел в двух областях, как это:
1.234 (real)
-40 (smallint)
, где это эквивалентно 1,234 * 10^-40? Это обеспечило бы ~ 32000 ведущих десятичных знаков с двумя байтами, используемыми для их хранения, и 4 байта для хранения реального значения, в общей сложности максимально 6 байтов на номер (дает мне точный номер, который я хочу сохранить, и занимает меньше места, чем существующее решение, которое потребляет 8 байтов). Похоже, что сортировка этих чисел будет значительно улучшена, так как вам нужно будет только отсортировать по полю smallint, а затем второе поле реального поля.
Довольно уверен, что я не понимаю. Стандартный 8-байтовый формат IEEE для чисел с двойной точностью позволяет отображать очень маленькие числа как значение и показатель. Если вы можете жить с точностью до 15 цифр, почему бы просто не использовать формат двойной точности? – scottb
@scottb Поскольку, как я уже упоминал в вопросе, округление всех моих результатов до 15-значной точности приводит к тому, что мои графики имеют четкую линию с такой точностью, поэтому, поскольку значение этих данных функционально эквивалентно, дисплей выглядит ужасно. – sage88
Если ваши графики «выравниваются», более вероятно, что существует проблема с масштабированием ваших графиков или непреднамеренным литьем ваших значений в интегральные типы. Номера двойной точности IEEE способны отображать очень малые числа, вплоть до пределов точности, поскольку они очень большие. В частности, не должно быть преимуществ отдельно хранить значимость и показатель отдельно в вашей базе данных, как вы предлагали, поскольку это то, как внутренние числа двойной точности представлены внутри. – scottb