【发布时间】:2011-02-10 17:19:01
【问题描述】:
我在 SQL Server 中有一个表,我希望将插入添加到表的末尾(而不是导致它们插入到中间的集群键)。这意味着我希望表由一些会不断增加的列聚集。
这可以通过在datetime 列上进行聚类来实现:
CREATE TABLE Things (
...
CreatedDate datetime DEFAULT getdate(),
[timestamp] timestamp,
CONSTRAINT [IX_Things] UNIQUE CLUSTERED (CreatedDate)
)
但我不能保证两个Things 不会有相同的时间。所以我的要求并不能真正通过日期时间列来实现。
我可以添加一个虚拟 identity int 列,并在其上进行聚类:
CREATE TABLE Things (
...
RowID int IDENTITY(1,1),
[timestamp] timestamp,
CONSTRAINT [IX_Things] UNIQUE CLUSTERED (RowID)
)
但是你会注意到我的表已经包含一个timestamp 列;保证单调递增的列。这正是我想要的候选集群键的特性。
所以我将表格聚集在rowversion(又名timestamp)列上:
CREATE TABLE Things (
...
[timestamp] timestamp,
CONSTRAINT [IX_Things] UNIQUE CLUSTERED (timestamp)
)
我没有添加一个虚拟的身份 int 列(RowID)来确保订单,而是使用我已经拥有的。
我正在寻找的是为什么这是一个坏主意的想法;以及还有哪些更好的想法。
注意:社区维基,因为答案是主观的。
【问题讨论】:
-
时间戳将是一个非常糟糕的主意,因为每当更新行时它就会更新!
-
这是 MS SQL 吗?如果是这样,聚簇索引不必是唯一的,因此只需将其从约束中删除即可。
-
@Martin Smith:哦,该死的,我忘了!你应该把它放在一个答案中,所以我可以接受它作为“哦,上帝不要这样做”。
-
@Chris Hass:如果聚集索引未标记为唯一,SQL Server 将添加另一个 4 字节“唯一符”。当 8 字节时间戳已经是唯一时,每行再浪费 4 字节是没有意义的。
-
@Ian Boyd,前提是您没有在其他地方声明唯一索引,对吧?
标签: sql-server timestamp clustered-index rowversion