我使用的是OLAP系统,有些表有文本字段。文本长度可以是从某些字节到KB,而一行中其他固定大小字段的大小只有大约100字节。
我的一些表有数十亿行,文本字段的值高度可重复,如何减少这种冗余以节省存储空间并且不会丢失查询性能?
答案 0 :(得分:1)
Redundant 是数据库工作中的技术术语。这并不意味着“重复”。这意味着“不必要地重复”。你可能没有任何不必要的重复;每个值在其自己的行中是必需的,以便向用户传达正确的含义。
有时,您可以使用较短的人类可读代码替换现有值。较短的代码会产生较窄的表,这意味着数据库中每页的行数更多,I / O更快。例如,在美国,我们经常使用两个字母的邮政编码代替州的全名。这几乎总是有效的。 (这意味着人类可以在不进一步处理的情况下读取输出,并且查询运行至少快一点。)
有时,您可以使用代理键替换现有值,希望更快的磁盘I / O能够抵消额外连接的成本。有时这种策略不会工作;您需要测试并准备恢复到原始模式。
答案 1 :(得分:0)
报告数据库中的URL之前给我带来了麻烦。可能值得尝试的是将URL分成3个部分 - 主机名/端口,路径&查询字符串 - 您可能最终得到一个url-fragment表(可能不止一个),以及一个带有FK到URL片段表的URL表。有时查询字符串不值得单独存储,在这种情况下,URL表具有主机名&的FK。路径,并存储查询字符串。
另一个想法是砍掉查询字符串中无用的部分 - 这个决定需要在逐个应用程序的基础上进行,但可以产生很大的不同 - 从URL中删除会话ID可以大大改善事情(也可以,你可以可能会删除谷歌分析参数。
此外,只在需要时访问URL表,并确保至少在主机名上有索引。