我正在考虑使用 adatetime2(7)
作为聚集索引。
如果我总是使用填充该列SYSDATETIME
,同一个实例是否有可能两次发出相同的值(假设我们不做类似设置系统时钟的事情)?
或者,确保此类列的唯一性的内聚策略是什么,即使它是以时间精度为代价的?
对于我的使用,我真的只关心秒数,但我将在此列上进行大量范围查询,因此 CI似乎是合适的。
我正在考虑使用 adatetime2(7)
作为聚集索引。
如果我总是使用填充该列SYSDATETIME
,同一个实例是否有可能两次发出相同的值(假设我们不做类似设置系统时钟的事情)?
或者,确保此类列的唯一性的内聚策略是什么,即使它是以时间精度为代价的?
对于我的使用,我真的只关心秒数,但我将在此列上进行大量范围查询,因此 CI似乎是合适的。
是的。Windows 时钟的分辨率不错,但并不完美。您应该使用其他字段(例如
INT IDENTITY
)来确保唯一性。但是,如果适合您的需要,请先确定日期。或者,您可以使用
DATETIME
PK,但使用一个存储过程来监督插入,该存储过程验证传入日期的唯一性,并在必要时暂停。如果你愿意,我可以举一个例子。编辑:
另一种选择,借用 ypercube 的评论,将是日期字段上的非唯一聚集索引,以及该字段上的唯一非聚集主键
ID
。这将使您的其他索引更小,因为它们会指向窄ID
列,但也需要两步才能获得实际数据。选择聚簇索引 KEY 时要小心,因为它将传播到表的所有非聚簇索引。Datetime2 值的长度为 8 个字节,您可以考虑
INT IDENTITY
像 Jon 所说的那样。