还记得您在处理大型MSSQL表时所取得的进展吗?

本文关键字:处理 大型 MSSQL 还记得 | 更新日期: 2023-09-27 18:13:40

我们有一个应用程序,它执行一个作业来处理来自mssql视图的一系列行。这个视图包含许多的行,并且插入了一个额外的列(dataid),设置为标识,这意味着我们可以使用它来知道我们在数据集中已经走了多远。

前段时间,我们在获取大于y的数据(y是我们处理的最后一个最大的数据)的前n行时遇到了一些问题。似乎行没有按正确的顺序返回,这意味着当我们抓取一系列行时,似乎有些行的dataid放错了位置,这意味着我们处理了一个dataid为100的行,而实际上我们只得到了95。

每次压缩时窗口/范围为100行。但是,如果行数据不是按顺序排列的,那么获取下一个100行的查询可能包含一个真正应该在下一次紧缩中定位的数据。然后,在执行下一次紧缩时,将跳过行。

在数据上的一个命令可以解决这个问题,但这是一种方式慢。你们有什么建议可以做得更好吗?

当我说很多行时,我的意思是几十亿行,是的,如果你认为这绝对是疯狂的,你完全正确!

我们使用Dapper将行映射到对象。这是完全只读的

我希望这个问题不要太模糊。提前感谢!

还记得您在处理大型MSSQL表时所取得的进展吗?

在数据上的一个命令可以解决问题,但这是一种方式,速度慢。

应用适当的索引。

唯一的答案是"为什么我的查询慢"是:如何:优化SQL查询。

不清楚您在同一句中混合'view'和'insert'是什么意思。如果你真的想要一个项目IDENTITY 函数的视图,那么你现在可以停止了,它不会工作。您需要有一个持久的书签来恢复您的工作。视图在SELECT中投影的IDENTITY不符合持久性标准。

您需要以定义良好的顺序处理数据,该顺序在连续读取时是持久的。您必须能够读取在给定顺序中明确定义边界的键。您需要将在同一事务中处理的最后一个键与批处理行保存在一起。如何达到这些要求,完全取决于你自己。典型的解决方案是以聚集索引顺序进行处理,并记住最后处理的集群键位置。必须有唯一的集群键。IDENTITY 属性和它的聚集索引使满足所需的条件。

如果您只想处理最后100个数据,那么您可以考虑对数据进行分区。

在索引中包含另一个999999000000有什么意义?