2014-01-30 2 views
2

У меня есть база данных PostgreSQL с миллионами строк данных даты/времени. Временной диапазон данных - с 2004 года по настоящее время. Часовой пояс всегда UTC. Из-за ограниченного места на диске в моей учетной записи веб-хостинга я хочу как можно больше уменьшить размер базы данных. Я знаю, что в Microsoft SQL Server существует тип данных SMALLDATETIME с размером 4 байта.smalldatetime в PostgreSQL

Есть ли что-то эквивалентное SMALLDATETIME в Postgres?

(Примечание:.. Я посмотрел на инструкции Postgres, но все «дата и время» 8 байт 4 байта «дата» тип данных не подходит моим потребностям, потому что мне нужно разрешение в минутах)

ответ

2

Нет, такого типа нет. Это было бы неплохо для нескольких случаев использования, но оно не поддерживается.

Что вы можете сделать как компромисс хранения секунд с момента смещения эпохи:

extract(epoch from mydate) - extract(epoch from TIMESTAMP '2004-01-01 00:00:00') 

в integer колонке, а затем восстановить дату на лету. Это будет иметь влияние производительности и, что более важно, сосать для удобочитаемости, но это сработает.

SELECT to_timestamp(mydatesecondssince2004 + extract(epoch from TIMESTAMP '2004-01-01 00:00:00')) FROM mytable 

В качестве альтернативы, вы можете быть человеком, который решает добавить «smalldate» и типа «smalltimestamp»; PostgreSQL является открытым исходным кодом, и это означает, что людям нужно делать что-то, если они хотят, чтобы они произошли.

+0

На самом деле, старые версии postgres используют 4-байтовую дату/время, называемую абстимом, но теперь это устарело. Я немного изучил требования к дисковым хранилищам Postgres. Похоже, что накладные расходы на 24 байта! Таким образом, сохранение 4 байтов в datetime не будет иметь большого значения. Я удивлен, как «голодны для дискового пространства» Postgres, накладные расходы строки MSSQL составляют всего 7 байт ... – jirikadlec2

+0

@ jirikadlec2 Поддерживает ли MS SQL журнал журналов отката/повтора и строки _replace_ в основной таблице? Если это так, как Oracle, это означает, что нет необходимости хранить информацию о видимости транзакций в главной таблице, что значительно уменьшает размеры строк - ценой выполнения запросов по таблицам, которые меняются, когда они читаются значительно медленнее, когда они для сканирования журнала отката. Я не уверен, что компромисс PostgreSQL является правильным, но на этот момент его нелегко изменить ... –

+0

Наверное, мой лучший выбор при сохранении дискового пространства в Postgresql мог бы объединить мои «узкие» таблицы в один «широкий», Таблица. Сейчас у меня есть около 10 отдельных таблиц, таких как TEMPERATURE (station_id, time, value) или RAINFALL (station_id, time, value). Вместо этого я бы создал одну таблицу HOURLY_DATA (station_id, time, temperature_value, rainfall_value), тем самым уменьшив количество строк, необходимых для хранения моих данных. – jirikadlec2

Смежные вопросы