0

我必须在一个大表的列中存储一组明确的字符串值。您可能想知道为什么我不使用另一个查找表并设置 FK-PK 关系;可以想象这是有充分理由的。

Oracle 是否对此类列使用压缩机制?或者,有没有办法让它使用一个?

如果答案是否定的,Oracle 是否只存储每个重复值的确切字符?你能提供一个参考吗?

4

1 回答 1

4

与日期一样, Oracle 不会为您压缩数据。

搭建一个简单的环境:

create table test ( str varchar2(100) );

insert all
  into test values ('aaa')
  into test values ('aba')
  into test values ('aab')
  into test values ('abb')
  into test values ('bbb')
select * from dual;

和 using DUMP(),它返回数据类型、字节长度和数据的内部表示,您可以看到使用此查询存储的内容:

select str, dump(str)
  from test

答案是在每种情况下都存储了 3 个字节。

+-----+-----------------------+
| STR |       DUMP(STR)       |
+-----+-----------------------+
| aaa | Typ=1 Len=3: 97,97,97 |
| aba | Typ=1 Len=3: 97,98,97 |
| aab | Typ=1 Len=3: 97,97,98 |
| abb | Typ=1 Len=3: 97,98,98 |
| bbb | Typ=1 Len=3: 98,98,98 |
+-----+-----------------------+

SQL小提琴

正如 jonearles 在链接的答案中所建议的那样,您可以使用表压缩来减少存储的字节量,但是有一些权衡。改为如下声明您的表:

create table test ( str varchar2(100) ) compress;

请注意文档中的所有警告以及 jonearles 的回答;这里有太多的帖子。

您不太可能需要以这种方式保存几个字节。

于 2013-06-30T11:47:05.640 回答