1

我还在 C# 和 SQL Server 的学习曲线上,所以请原谅我的“绿色”。

这是我的场景:

我有一个包含 10,000 行的 EMPLOYEE 表。这些员工中的每一个在 TRANSACTIONS 表中都有事务。

交易表有基本工资、代理津贴、加班时间等工资元素。它还有工资扣除,如预扣、部分贷款(含利息)和储蓄(养老金、社保储蓄等)。

我需要检查每个员工的交易并计算税金、未偿还的贷款余额、更新储蓄余额、将工作时间转换为付款/扣除额以及其他一些东西。

此处理将为每个员工提供一组新的行,并带有一个期间标记(例如 2013 年 4 月的 2013-04)。我需要将其存储在 HISTORY 表中以供将来参考。

处理整个 10,000 个员工表及其事务的最佳方法是什么?

有人告诉我,通过阅读器将整个表格拉入内存不是好的做法,我同意。

我是否一直从数据库中提取员工、处理他们的事务并将历史记录提交到数据库?并拉下一个等等?

后端调用太多?

(EF 不是我的选择,仍在 ADO.NET 中执行原始 SQL)

我将不胜感激这方面的任何帮助。

4

2 回答 2

3

10000 行并不多。如果没有大量的 varchar 或 binary 列,内存可以轻松处理。不要觉得完全被良好的实践“规则”所束缚。

另一方面,考虑一个存储过程。然后所有处理都将在服务器本地完成。

编辑:如果以上都不是一个选项,请尝试流式传输您的结果。例如,在阅读查询时,将每一行保存在 aConcurrentQueue或类似的内容中。在执行查询之前,启动另一个线程或 aBackgroundWorker来检查队列中的新项目并将结果同时保存在另一个SqlConnection. Count查询完成且队列为0时,工作将完成。

于 2013-04-24T11:30:42.027 回答
1

使用ROW_NUMBER(). 程序可以使用它来允许一次使用“x”行数来浏览大型表。然后,您可以想象使用相同的方法对您的作业进行批处理,例如,一次 1000 行。

有关更多信息,请参阅链接。

于 2013-04-24T11:44:48.653 回答