![]() |
1
17
考虑到PostgreSQL中任何一行的开销是 23 bytes (heaptupleheaderdata),如果你真的这么在乎少量的空间,那么你可能选择了错误的方法来存储数据。 不管怎样,因为所有更复杂的类型都有自己的开销(字节增加了四个字节的开销,例如位字符串5到8),所以要完成您所寻找的工作,唯一的方法是使用一个bigint(8个字节),用数字移动每个值,或者将结果组合在一起。您可以使用 bit string operations 为了使代码更容易——计算为位字符串,然后在存储之前强制转换为bigint——或者,如果您希望速度更好,只需手动进行乘法/加法。例如,下面介绍如何将两个字节一起存储到一个双字节结构中,然后再将它们返回:
您可以通过这种方式将相同的想法扩展到存储其中的7个。检索开销仍然是可怕的,但实际上在这个过程中您已经节省了一些空间。但与行标题无关。 |
![]() |
2
4
有
|
![]() |
3
2
是否使用这些值查找记录? 如果是-使用像int4这样的普通数据类型(如果使用64位体系结构,甚至是int8)。 如果不是,首先问问你自己,将这些值存储在pg中有什么意义?您可以使用字节(复杂的I/O)或位串(甚至更复杂的I/O),但要点是什么?你将有多少十亿个记录?您是否检查过较小的数据类型使用较少的空间(提示:它没有,请检查它-是否涉及数据对齐问题)?您是否认为较小的数据类型更快(事实上,比较两个int2值比32位体系结构上的两个int4值更复杂)。 |
![]() |
4
1
你会想看看
还有位字符串数据类型: http://www.postgresql.org/docs/8.4/interactive/datatype-bit.html |
![]() |
5
1
首先你问了7个字节,但现在是6个字节。六个8位值正好对应于mac地址大小和postgresql的内置类型macaddr。您可以使用mac语法f.i.a1-b2-c3-d4-e5-f6插入这些字节。 |
![]() |
6
1
我自己还没有测试过,但是有一些扩展;例如 http://pgxn.org/dist/tinyint/ . |
![]() |
7
1
|
|
tggtsed · PostgreSQL从平均值中排除值 1 年前 |
![]() |
Dawid · 为什么我不能在子查询中使用表别名? 2 年前 |
![]() |
CraZyCoDer · 在PostgreSQL中锁定潜在事务 2 年前 |
![]() |
ranebec · 计数时如何返回0而不是null? 2 年前 |
![]() |
Flo · 分组依据中的SQL大小写 2 年前 |