SQL 非唯一列上的服务器聚集索引

SQL Server Clustered Index on Non-Unique Column

我一直在努力阅读有关使用聚簇索引作为提高查询性能的方法的信息。

本质上,我有一个 'Messages' table,用于聊天应用程序。当用户打开聊天时,我们会根据用户正在与之交谈的客户从 table 中读取消息历史记录。

消息 table 由以下列组成:

Id : CustomerId : 内容

table 上最常使用的查询类似于

SELECT * FROM Message WHERE CustomerId = @CustomerId

我的问题是,CustomerId 列是聚集索引的 suitable 候选列吗?另外,如果ID字段是主键,SQL服务器还需要'uniqueify'聚簇索引吗?

table 将在选择和插入上都很繁重。

聚簇索引不需要唯一,可以。

但是,问题是每次插入新消息时,SQL 服务器需要为同一客户的其他行旁边的新行找到 space。这通常是低效的,因为页面需要拆分,导致许多页面半填满。而且,如果您还删除了行,事情会变得更加复杂。

有几个选项。在繁忙的数据库中,您可以在页面上留出空间用于额外的插入。或者,另一种选择是根据客户 ID 对 table 进行分区。这一切都取决于。

在大多数情况下,消息 table 上的标识列将是主键和聚集键。客户 table 的附加索引就足够了。但是,在某些情况下肯定有可以更好地工作的替代结构。

在已经有主键约束的键上添加聚簇索引是不必要的重复。相反,主键约束也应该是聚集索引。但是,你的问题其实不一样...

is the CustomerId column a suitable candidate for a clustered index?

如果不知道您将如何查询 table,就无法回答这个问题。有许多查询模式,该组织将不是最佳(典型示例是时间序列,其中时间列是适当的聚集键)。并且这个 最好的聚簇索引的查询示例同样多。无法回答。

given that the ID field is the primary key, will SQL Server still need to 'uniqueify' the clustered index?

如果索引不是声明的唯一的,那么SQL服务器将添加uniquifier列。但是,列 value 永远不会实现,因为不会出现重复项。

I have a 'Messages' table, which is used in a chat application ... WHERE CustomerId = @Id ... the ID field is the primary key

对不起,这没有任何意义。您的意思是 Messages table 只能收到来自每个客户的一条消息 。那将带来糟糕的聊天体验。我很确定你的解释是错误的。

我希望 Customers table 在 CustomerId 上具有聚簇索引和主键约束。 Messages table 很可能是由 聊天室 或其他将聊天参与者配对的小组组织组织的。如果聊天 总是 在一位且恰好一位客户和一位代表之间,那么 'chat room' 可能就是客户本身。无论如何,这种 Messages table 的典型查询需要 在聊天室中交换的所有消息,按照张贴的顺序 与客户交换的所有消息,按发布顺序。这实际上是一个分区时间序列,最好由像 (chat_id, post_time)(customer_id, post_time) 这样的聚簇索引提供服务。请注意,这是 而不是 主键,table 可能有一个 message_id 作为主键,但不是聚集的。