Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server ID排序(int PK)与创建时间_Sql Server_Database - Fatal编程技术网

Sql server ID排序(int PK)与创建时间

Sql server ID排序(int PK)与创建时间,sql-server,database,Sql Server,Database,假设我有博客评论。在insert时,他们获取当前utc日期时间作为其创建时间(通过sysutcdatetime默认值),并获取ID(通过整数标识列作为PK) 现在我想按年龄对评论进行排序。只按ID执行订单安全吗还是需要使用创建时间?我正在考虑插入的“并发”提交和回滚,以及读提交的隔离级别。ID有时可能不代表插入顺序吗 我这样问是因为如果按ID排序是安全的,那么我可以获得以下好处: 我不需要创建时间的索引 按ID排序可能更快 我不需要datetime2列的高精度,因为这只在排序时需要(为了不让两

假设我有博客评论。在insert时,他们获取当前utc日期时间作为其创建时间(通过sysutcdatetime默认值),并获取ID(通过整数标识列作为PK)

现在我想按年龄对评论进行排序。只按ID执行
订单安全吗
还是需要使用创建时间?我正在考虑插入的“并发”提交和回滚,以及读提交的隔离级别。ID有时可能不代表插入顺序吗

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

  • 我不需要创建时间的索引
  • 按ID排序可能更快
  • 我不需要datetime2列的高精度,因为这只在排序时需要(为了不让两行的创建时间相同)
答案是,当你没有创造时间时,这是可能的,但它总是安全的吗

答案是使用标识栏是不安全的。但当它也是PK时,答案给出了一个按ID排序的示例,但没有提到这是否安全

编辑:


答案建议按日期排序,然后按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