【发布时间】:2021-02-02 02:38:50
【问题描述】:
我想强调的是,我正在寻找想法,不一定是具体的答案,因为很难显示我的查询是什么样的,但我认为没有必要。
流程如下:
-
表 A 不断填满,就像一个桶一样 - SQL 作业每分钟或更短时间都会调用 SP_Proc1,并将多条记录插入表 A。
-
同时,C# 进程每分钟或更短时间不断调用另一个过程 SP_Proc2,从表 A 中进行有序的 TOP 5 选择并将结果返回给 C# 方法。在 C# 代码完成处理结果后,它会从表 A 中删除选定的 5 条记录。
我将上面有问题的部分加粗。有必要按指定的顺序一次处理 5 个表 A 中的记录,但每月几次 SP_Proc2 以错误的顺序选择排序的 TOP 5 记录,即使所有记录都存在于表 A 中并且具有正确的用于排序的列值。
注意事项:
- 我按整数排序,而不是 varchar。
- C# 部分使用 1 个线程。
- SP_Proc1 和 SP_Proc2 都使用事务并使用 READ COMMITTED 或 READ COMMITTED SNAPSHOT 事务隔离级别。
- 用于排序的一列是计算值,但非常简单。它只是检查表 A 中的另一列是否不为空,并将计算列设置为 1 或 0。
- 在主键 Id 上有一个唯一的非聚集索引和一个由用于 SP_Proc2 中排序的相同列组成的聚集索引。
- 我使用的是 SQL Server 2012 (v11.0.3000)
我开始认为这可能是一个 SQL 错误,或者可能是表 A 中的记录或索引被损坏,然后被 C# 进程删除,这就是我无法捕捉到它的原因。
编辑:
为了澄清,SP_Proc1 一次将一大批 N 记录提交到表 A,SP_Proc2 以 5 个批次从表 A 中提取记录,它对表中的记录进行排序并选择 TOP 5,有时选择了错误的批次,批次本身是正确订购的,但应该根据 ORDER BY 选择不同的批次。我相信Rob Farley 可能有正确的想法。
【问题讨论】:
-
ORDER BY不会被忽略;这意味着可能的原因是您误解了某些东西,或者该过程存在缺陷。老实说,没有任何代码,我猜是后者。 -
换一种说法,您为什么要运行 SQL Server 2012 SP1?为什么8年没有更新(SP1在212年11月出来)?
-
SQL Server 是多线程的,不按顺序存储数据。因此,当您进行查询时,您总是需要 top 执行 orderby 才能以正确的顺序获取数据。现在,当您使用 top 时,您将在查询运行时获得顶部,并且可能会在查询运行后立即更改。因此,如果您想删除相同的前五个项目,则必须使用 WHERE 来删除,该 WHERE 唯一标识您要删除的五个 tiems。
-
认为这可能是一个 SQL 错误 不——作为程序员,您应该始终怀疑自己的代码是问题的根源。并且有很多关于使用表作为队列的讨论 - 这可能是一个很好的起点。
-
"认为这可能是一个 SQL 错误" 即使它是您使用的是 8 年前的版本;因此,第一步是安装最近 8 年的更新。
标签: c# sql-server tsql sql-order-by