Sql server 日期上的聚集索引

Sql server 日期上的聚集索引,sql-server,indexing,Sql Server,Indexing,我正在为一个项目重新设计一个数据库,因为当前的版本不再符合它的实际使用情况,并且正在造成严重的问题 该结构由几个主要表格组成: 对象标识符(FK,4字节整数) 记录的日期时间(对于不同的对象可以重复) 值(浮动) 从其他问题(例如)中,我推断聚集索引不应该用于复合键,最好是较小的数据类型 此表中的数据(数百万条记录,每天增长10万条)仅根据datetime字段(获取最小值/最大值或日期范围内对象的所有值)插入或查询过,更新和删除几乎从未发生过,仅在查询发生的小时之外。 插入的顺序通常随日期时

我正在为一个项目重新设计一个数据库,因为当前的版本不再符合它的实际使用情况,并且正在造成严重的问题

该结构由几个主要表格组成:

  • 对象标识符(FK,4字节整数)
  • 记录的日期时间(对于不同的对象可以重复)
  • 值(浮动)
从其他问题(例如)中,我推断聚集索引不应该用于复合键,最好是较小的数据类型

此表中的数据(数百万条记录,每天增长10万条)仅根据datetime字段(获取最小值/最大值或日期范围内对象的所有值)插入或查询过,更新和删除几乎从未发生过,仅在查询发生的小时之外。 插入的顺序通常随日期时间的增加而增加,但观察到细微差异,有时需要插入更大的积压。 潜在ID字段的顺序将正确匹配单个对象的日期时间增长,但通常不会匹配所有记录


我的问题是:我看到了在这种表上创建键/索引的几种不同方法,但在这些情况下,键的哪种方法最有效?

在您的情况下,在
DATETIME
列上创建一列聚集索引是行不通的。值不会是唯一的

为了避免碎片化,对聚集索引进行隐式排序是非常重要的。最简单的是
IDENTITY

创建聚集索引时,聚集索引是表。从字面上讲,它是物理存储的数据量。此索引隐式包含所有其他列。当您创建另一个索引(当然是非聚集索引)时,现有聚集索引将用作查找表

由于有数百万条记录,您会遇到I/O问题。必须加载多个页面才能将所有值聚集在一起,它结合了关系数据库管理系统的优点和面向列的存储系统的速度。这个索引存储在一个块中,可以极大地加快对海量数据的查询速度!您付出的代价是磁盘空间和较慢的操作

您可以使用2-cloumn聚集索引,将日期(首先)与
IDENTITY
列组合在一起。这将按照日期顺序对表进行物理排序。这应该也能很快奏效


什么对您最有利取决于许多细节:

我认为最好的选择是如您所述,因为数据是通过datetime字段查询的。您可以在此datetime字段上放置聚集的非唯一索引(因为此列中的数据不是唯一的)。通过这种方式,SQLServer在重复的日期时间记录(您看不到)旁边添加一个唯一标识符,从而在内部使其唯一。这可能是硬盘上占用空间的一个开销,但是另一方面,你的查询应该会飞起来。你可以考虑移动它来感谢你的答案。该链接似乎也很有趣,但只需首先应用建议的索引即可分析情况。@Shnugo我也有同样的要求。如何创建日期和标识的聚集索引?我是改变主键还是仅仅创建一个新索引?@legen---waitforit---dary请打开一个新问题并提供更多细节。你可以在这里发表评论,并附上新问题的链接。嗨@Shnugo谢谢。我提出了一个新问题,我想我得到了我想要的。使用带有日期的GUID作为聚集索引会不会很重?