我必须在一个大表的列中存储明确的字符串值集。您可能想知道为什么我不使用另一个查找表并设置FK-PK关系;很好想象这是有充分理由的。
Oracle是否对此类列使用压缩机制?或者,有没有办法让它使用一个?
如果答案是否定的,Oracle是否只存储每个重复值的确切字符?你能提供参考吗?
答案 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 |
+-----+-----------------------+
正如jonearles在链接答案中建议的那样,您可以使用table compression来减少存储的字节数,但是有许多权衡。相反,声明你的表:
create table test ( str varchar2(100) ) compress;
请注意文档中的所有警告以及jonearles的回答;这里发帖太多了。
您不太可能以这种方式保存几个字节。