【问题标题】:is there a way to save data in database smaller than 1 byte?有没有办法将数据保存在小于 1 字节的数据库中?
【发布时间】:2018-02-27 12:19:19
【问题描述】:

我有一个大数据(一些 TB),我必须保存在数据库中。

我有一些可以少量保存的列(列 A 有 20 个唯一值 1...20 ,列 B 有 10 个值等等...)。

有没有办法将此数据保存在仅 4 位、5 位...(按需要)的数据库中?不像 tiny int 或类似的 1 字节。

如果那样的话。我应该使用什么数据库引擎(针对这种特定情况)?

【问题讨论】:

  • 对于 Oracle,我认为不是。如果您创建一个 CHARACTER 数据类型列,您可以指定 CHAR 或 BYTE,没有什么比这更小了。
  • 不,你不能。至少在我知道的操作系统上至少可以将 8 位作为一个单元处理。
  • 为什么要保存在不到一个字节的范围内?不管它在你看来如何,它至少会保存在系统中的一个字节中。如果您担心数据的大小并且您已经拥有数 TB 的数据,那么与担心包含 4 位数据的单个列相比,似乎有更有效的地方来控制大小。
  • 不,您不能将值 1 到 20 存储在 4 位中。
  • @a_horse_with_no_name 当然,我指的是存储,而不是 CPU 寄存器处理。就空间使用而言,64 位系统上的存储仍然可以减少到字节。如果将记录中的更多字段打包在位字段中,它只会更少。

标签: sql oracle bigdata bit


【解决方案1】:

如果你真的想要,你可以将多个值打包到一个字节中,并使用虚拟列和位操作来提取单个值:

SQL Fiddle

Oracle 11g R2 架构设置

CREATE TABLE test (
  value CHAR(1 BYTE),
  five_bits NUMBER(2,0) GENERATED ALWAYS
            AS ( BITAND( ASCII(value), 1+2+4+8+16 ) ) VIRTUAL,
  two_bits  NUMBER(1,0) GENERATED ALWAYS
            AS ( BITAND( ASCII(value), 32+64 ) / 32 ) VIRTUAL,
  one_bit   NUMBER(1,0) GENERATED ALWAYS
            AS ( BITAND( ASCII(value), 128 ) / 128 ) VIRTUAL
);

INSERT INTO test ( value ) VALUES ( CHR( 20 + 2*32 + 0*128 ) );

查询 1

SELECT * FROM test

Results

| VALUE | FIVE_BITS | TWO_BITS | ONE_BIT |
|-------|-----------|----------|---------|
|     T |        20 |        2 |       0 |

但是,使用此解决方法会产生性能开销,我建议保存有限数量的字节可能不值得。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-11
    • 1970-01-01
    • 1970-01-01
    • 2020-10-12
    • 2010-12-26
    • 1970-01-01
    • 1970-01-01
    • 2014-02-09
    相关资源
    最近更新 更多