【问题标题】:MS SQL Server Optimize repeated column valuesMS SQL Server 优化重复的列值
【发布时间】: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


【解决方案1】:

您提供的示例数据表明,业务域中存在“鞋类”实体,并且所有鞋都与单一鞋类具有强制性关系。如果值是描述性文本,情况会有所不同 - 例如“有吸引力的跑鞋,适合田径和休闲穿着”。重复值通常(但当然不总是)表明您可以提取另一个实体。

您建议该表将有数百万条记录。笼统地说,我建议设计您的架构以反映业务领域,并且只有在您知道并且可以衡量您遇到性能问题时才使用奇异的优化选项。

在您的情况下,我建议分解出一个名为“shoe_types”的单独表,并包含从“shoes”到“shoe_types”的外键关系。 “shoe_types”的主键应该是聚集索引,“shoe_types”中的“shoe_type_id”应该是常规索引。在所有条件相同的情况下,有(数千万)行,命中外键索引应该非常快。

此外,支持诸如“查找所有鞋子类型名称以'nik%'开头的鞋子”这样的查询应该更快,因为 shoe_types 表的行数应该比“鞋子”少得多。

【讨论】:

    猜你喜欢
    • 2014-09-23
    • 1970-01-01
    • 1970-01-01
    • 2021-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多