【发布时间】:2021-06-28 10:36:28
【问题描述】:
我被要求创建一个包含许多重复值的表,但我不确定这是否是最好的方法。
我必须使用 SQL Server。我很想使用 Azure 表存储和分区键,但我不允许。
假设表 Shoes 有列
id int, customer_name varchar(50), shoe_type varchar(50)
问题是shoe_type 列将有数百万个重复值,我想将它们放在自己的分区中,但 SQL Server 只允许范围分区 afaik。
我不希望重复值占用比需要更多的空间,这意味着如果列值重复 50 次,我不希望它占用 50 倍以上的空间,只需要 1 次。
我考虑过使用列shoe_type(作为int)和另一个具有其字符串值的表之间的关系,但这是我可以优化的最多吗?
编辑
Shoes表数据
id customer_name shoe_type
-----------------------------
1 a nike
2 b adidas
3 c adidas
4 d nike
5 e adidas
6 f nike
7 g puma
8 h nike
如您所见,行包含重复的 shoe_type 值(nike、adidas、puma)。
我想到的是使用 shoe_type 列作为另一个表的 int 外键,但我不确定这是否是最有效的方法,因为在 Azure 表存储中你有分区和分区键,并且在 MS SQL Server 中,您有分区,但它们是仅范围内的。
【问题讨论】:
-
与其让我们“想象”数据,不如为我们提供一些数据。为您的示例数据发布 DDL 和 DML 脚本,然后发布您对所述数据的预期结果。
-
听起来像是过早的优化。不要“想象”一个尚不存在的问题。
-
如果您的数据是高度重复的,那么(聚集的)列存储索引将很快完成。 CS 索引是否能够正确支持您的查询是另一回事(当然,您可以将它与行存储索引结合使用)。另一种选择是带有页面压缩的行存储索引。如果只有 一个 值经常重复而其余的不是,您可以使用过滤索引来专门包含或排除它。
-
@Larnu,谢谢,我已经编辑了帖子。
-
@SMor,我明白你在说什么,但我已经问过这个具体问题。
标签: sql sql-server optimization storage