Sql server ID排序(int PK)与创建时间
假设我有博客评论。在insert时,他们获取当前utc日期时间作为其创建时间(通过sysutcdatetime默认值),并获取ID(通过整数标识列作为PK) 现在我想按年龄对评论进行排序。只按ID执行Sql server ID排序(int PK)与创建时间,sql-server,database,Sql Server,Database,假设我有博客评论。在insert时,他们获取当前utc日期时间作为其创建时间(通过sysutcdatetime默认值),并获取ID(通过整数标识列作为PK) 现在我想按年龄对评论进行排序。只按ID执行订单安全吗还是需要使用创建时间?我正在考虑插入的“并发”提交和回滚,以及读提交的隔离级别。ID有时可能不代表插入顺序吗 我这样问是因为如果按ID排序是安全的,那么我可以获得以下好处: 我不需要创建时间的索引 按ID排序可能更快 我不需要datetime2列的高精度,因为这只在排序时需要(为了不让两
订单安全吗
还是需要使用创建时间?我正在考虑插入的“并发”提交和回滚,以及读提交的隔离级别。ID有时可能不代表插入顺序吗
我这样问是因为如果按ID排序是安全的,那么我可以获得以下好处:
- 我不需要创建时间的索引
- 按ID排序可能更快
- 我不需要datetime2列的高精度,因为这只在排序时需要(为了不让两行的创建时间相同)
答案建议按日期排序,然后按ID排序。如果您按ID按降序排序,并根据用户进行筛选,则您的博客将自动显示上面的最新文章,这将为您完成此任务。因此,不要将日期用作排序我会按
ID
排序
从技术上讲,当按ID排序与按时间排序时,您可能会得到不同的结果
sysutcdatetime
将返回事务开始的时间<代码>ID可以在交易过程中稍后的某个地方生成。而且,任何计算机上的时钟都会漂移。当计算机时钟与时间源同步时,时钟可能向前或向后跳。如果你经常同步,跳转会很小,但它会发生
从实际的角度来看,如果两条评论在彼此的一秒钟内发布,那么哪条评论先显示真的很重要吗
我认为重要的是显示结果的一致性。如果系统以某种方式决定注释A应该在注释B之前,那么这个顺序应该在整个系统中的任何地方都保留
因此,即使使用最高精度的datetime2(7)
列,也可能有两个时间戳完全相同的注释,如果您仅按此时间戳排序,则有时它们可能显示为A,B
,有时显示为B,A
如果您按ID
(主键)订购,则可以保证它是唯一的,因此订单将始终定义良好
我会按
ID
订购
再想一想,我会按时间和ID点菜
如果向用户显示注释的时间,则根据该时间显示注释非常重要。为保证一致性,在两条注释具有相同时间戳的情况下,按时间和ID排序。是的,ID可能会混淆,因为ID生成不是插入事务的一部分。这是为了不序列化表上的所有insert事务 最正确的排序方法是
按日期时间描述排序,ID DESC
,在多次生成同一日期的情况下,将ID添加为平局断路器。各种类型的连接断路器对于实现确定性结果非常重要。例如,您不希望在多次刷新页面时显示不同的数据
您可以在DateTime DESC,ID DESC
上定义覆盖索引,并获得与按CI键订购相同的性能(此处:ID
)。CI和NCIs之间没有相关的物理差异
既然你在某处提到了PK,我想指出,PK的选择并不影响任何一个。只有索引可以。查询处理器从不关心PK和唯一键。我的问题不是排序顺序,而是ID和创建时间之间的一致性。这里有好的观点。是否会发生以下情况?:我按ID排序,结果的时间列的顺序不准确。如果我的目标是顺序总是相同的,并且创建时间是有序的,那么我应该按ID和时间排序,还是按ID排序就足够了?好吧,如果你必须按时间排序,那么是的,按时间排序。比如,您向最终用户显示注释的时间。如果只在内部按ID排序,则以错误的顺序显示注释看起来不太好。您可以以秒精度甚至分钟精度显示此时间。我认为你不会以微秒的精度来显示它。因此,您可以按照显示的精度存储此时间,例如,
datetime2(0)
,然后按time,ID
排序,以使顺序一致,因为可能有两个相等的时间戳。一件小事:按年龄递减排序意味着我需要DateTime ASC,ID ASC
。