还记得在处理大型MSSQL表时你已经走了多远?

时间:2013-05-14 09:03:22

标签: c# .net sql-server tsql

我们有一个应用程序执行一个作业来处理来自mssql视图的一系列行。 此视图包含很多行,并且插入的数据包含一个设置为identity的附加列(dataid),这意味着我们可以使用它来了解我们已经获得的数据集的距离。

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

示例

每次紧缩时窗口/范围是100行。但是如果行的dataid不按顺序排列,那么查询获得接下来的100行可能包含一个真正应该位于下一个紧缩中的dataid。然后,当执行下一个紧缩时,将跳过行。

在dataid上的订单可以解决问题,但这是缓慢的方法。 你们有什么建议可以用更好/更好的方式做到这一点吗?

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

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

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

3 个答案:

答案 0 :(得分:2)

  

对dataid的命令可以解决问题,但这是缓慢的方法。

应用适当的索引。

“为什么我的查询速度慢”的唯一答案是:How To: Optimize SQL Queries

答案 1 :(得分:1)

在同一句话中混合'view'和'insert'并不清楚你的意思。如果你真的是指一个投影 IDENTITY function的视图,那么你现在可以停止,它将无法工作。您需要有一个持久书签才能恢复工作。视图在SELECT中投影的IDENTITY不符合持久性标准。

您需要以明确定义的顺序处理数据在连续读取时持久。您必须能够读取按给定顺序明确定义边界的键。您需要在与处理行的批处理相同的事务中保留处理的最后一个键。您如何实现这些要求完全取决于您。典型的解决方案是以聚簇索引顺序处理并记住最后处理的集群键位置。必须使用唯一的群集密钥。 IDENTITY property和聚集索引 满足您需要的条件。

答案 2 :(得分:0)

如果您只想处理最后100个,请给出1000000,您可以查看对数据进行分区。

在索引中包含其他999999000000的重点是什么?