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