对ID(int PK)与创建时间进行排序

时间:2016-01-11 11:21:24

标签: sql-server database

说我有博文发表评论。在插入时,它们将当前的utc日期时间作为其创建时间(通过sysutcdatetime默认值)获取,并且它们获得一个ID(通过整数标识列作为PK)。

现在我想根据年龄对评论进行排序。只做一个ORDER BY ID或者是否需要使用创建时间是否安全?我正在考虑"并发"插入的提交和回滚以及提交的读取的隔离级别。是否有可能ID有时不代表插入顺序?

我问这个是因为如果按ID排序是安全的,那么我可以获得以下好处:

  • 我不需要创建时间的索引。
  • 按ID排序可能更快
  • 我不需要datetime2列的高精度,因为只需要进行排序(为了没有两行具有相同的创建时间)。

This回答说,当你没有创作时间但它总是安全的时候有可能吗?

This回答说身份栏不安全。但是当它也是PK时,答案给出了一个按ID排序的例子,但没有提到这是否安全。

修改

This回答建议按日期排序,然后按ID排序。

3 个答案:

答案 0 :(得分:2)

是的,ID可能混乱,因为ID生成不是插入事务的一部分。这是为了不序列化表上的所有插入事务。

最正确的排序方式是ORDER BY DateTime DESC, ID DESC,如果多次生成相同的日期,则会将ID添加为平局。各种断路器对于获得确定性结果非常重要。例如,您不希望为页面的多次刷新显示不同的数据。

您可以在DateTime DESC, ID DESC上定义覆盖索引,并获得与CI密钥(此处:ID)订购时相同的性能。 CI和NCI之间没有相关的物理差异。

既然你在某个地方提到PK我想指出PK的选择不会影响到这一点。只做索引。查询处理器不关心PK和唯一密钥。

答案 1 :(得分:1)

我会按ID订购。

从技术上讲,按ID排序和按时间排序可能会得到不同的结果。

sysutcdatetime将返回交易开始的时间。稍后可以在事务期间的某处生成ID。此外,任何计算机上的时钟总是漂移。当计算机时钟与时间源同步时,时钟可以向前或向后跳跃。如果你经常进行同步,那么跳跃会很小,但会发生。

从实际的角度来看,如果两个评论在彼此之间发布,例如,彼此之间的一秒发布,那么首先显示哪些评论真的很重要吗?

我认为重要的是显示结果的一致性。如果系统以某种方式决定评论A应该在评论B之前进行,则应该在整个系统的任何地方保留此顺序。

因此,即使具有最高精度datetime2(7)列,也可能有两个具有完全相同时间戳的注释,如果仅按此时间戳排序,有时它们可​​能会显示为A, B有时候是B, A

如果您按ID(主键)订购,则可以保证它是唯一的,因此订单将始终定义良好。

我会按ID订购。

再想一想,我会按时间顺序和ID订购。

如果您向用户显示评论的时间,则必须根据此时间显示评论。如果两条注释具有相同的时间戳,则要保证时间和ID的一致性排序。

答案 2 :(得分:0)

如果您根据降序对ID进行排序,并且您正在根据用户进行过滤,那么您的博客将自动显示上面的最新帖子,这将为您完成工作。所以不要使用日期作为排序