是否在磁盘上为每个复制重复了离散字符串值?

时间:2013-06-30 11:21:26

标签: database string oracle oracle11g compression

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

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

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

1 个答案:

答案 0 :(得分:4)

As with dates 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;

并使用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 Fiddle

正如jonearles在链接答案中建议的那样,您可以使用table compression来减少存储的字节数,但是有许多权衡。相反,声明你的表:

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

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

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