繁体   English   中英

SQL 服务器聚集索引:唯一与递增

[英]SQL Server Clustered Index: Unique vs. Increasing

你好 StackOverflow 社区。

我目前正在重新设计必须存储基于时间的值的 SQL 服务器数据库表。 旧表每天接收大约 50,000,000 个条目,这变得太多了。 因此,我们计划每小时对条目进行分组,这样每天大约有 5,000 个条目。

我对新表的概念如下所示:

CREATE TABLE data.Values (
    Date date NOT NULL, /* The day of the values */
    Hour tinyint NOT NULL, /* The hour of the values */
    DeviceId int NOT NULL, /* The id of the gateway that these values belong to */
    Values varbinary(MAX) NOT NULL /* The actual values in binary format */
);

根据数据的时间戳deviceId ,新数据以二进制形式简单地附加到Values属性中的现有数据。

我的问题是为这个表找到一个好的聚簇索引。 正如我所读,聚集索引最重要的标准是:

  • 狭窄
  • static
  • 独特
  • 不断增加

前两点可以很容易地被任何索引候选者覆盖,因为写入的数据永远不会被修改并且只有几列。 我的两个选择是:

  • 如果我使用(Date, Hour, DeviceId)组合作为聚簇索引,那么它不会不断增加,因为来自各种设备(以及各种设备 ID)的数据将被写入。 只有日期+小时在不断增加。 但这种结合是独一无二的
  • 因此,如果我使用(Date, Hour)组合,那么索引会不断增加不再是唯一的,因为还有其他 deviceIds 使用相同的时间。

很快:如果我必须在唯一索引或不断增加的索引之间做出决定,是否有偏好?

感谢您的专业知识!

编辑:我注意到我可能对插入情况的解释很糟糕。 旧表中有许多插入,这将导致新表设计中列的更新。 但由于此列未编入索引,据我所知,它不应该损害性能。

根据您的解释, DateHourDeviceId的组合将是唯一的。 当使用多个列作为索引时,这些列被合并。 作为聚簇索引,决定了插入新记录时如何对记录进行排序。

因为我们说的是聚簇索引,它必须是窄的,static。这个索引也会决定排序顺序。 这是合乎逻辑的。

如果不唯一,SQL Server 将使其唯一。 这是在后台使用 UNIQUIFIER 密钥完成的。 该密钥的长度将增加 4 个字节。 (所以窄一点)有关更多信息,请搜索“UNIQUIFIER and sql server”。

如果密钥不是不断增加的,插入将不会总是在最后。 这会导致页面拆分并花费更多的时间来插入。 当进行大量插入时,页面拆分会损害您的性能。

如果密钥不断增加,插入将始终在最后完成。 这是我的偏好,因为在您的问题中,您谈论的是很多插入内容。 但...

如果你总是在最后插入,你可能会遇到锁定问题。 搜索“Last Page Insert Latch Contention。因为并发插入必须写入相同的 8K 页。您还可以在 google 中搜索“不断增加的聚集键无法扩展。 幸运的是,有一个解决方案可以解决这个问题。 您可以在 StackExchange 中阅读答案:链接: https://www.sqlpassion.at/archive/2014/04/15/an-ever-increasing-clustered-key-value-doesnt-scale/

这个答案符合您的问题,因为您的表中也有一个 varbinary(max) 。 请搜索“在数据库表中存储图像 varbinary(max) 数据的最佳做法是什么?” 这是链接: https://dba.stackexchange.com/questions/2624/what-is-the-best-practice-for-storing-image-varbinarymax-data-in-a-database-ta

那里提到的答案是设置“ALLOW_PAGE_LOCKS = OFF”。

另一篇好文章是这个链接: https://www.sqlskills.com/blogs/kimberly/ever-increasing-clustering-key-the-clustered-index-debate-again/

我希望我能提供帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM