我仍处于C#和SQL Server的学习曲线上,所以请原谅我的'绿色'。
以下是我的情景:
我有一个包含10,000行的EMPLOYEE表。这些员工中的每一个都在TRANSACTIONS表中进行交易。
交易表中有工资元素,如基本工资,代理津贴,加班时间等。还有工资扣除,如预扣款,部分贷款(有利息)和储蓄(养老金,社会保障储蓄等等。
我需要查看每位员工的交易和计算税金,贷款余额,更新储蓄余额,将小时数转换为付款/扣款以及其他一些内容。
此处理将为每位员工提供一组新的行,并带有句点标记(例如2013年4月的2013-04)。我需要将它存储在HISTORY表中以供将来参考。
处理整个10,000员工表及其交易的最佳方法是什么?
我被告知通过读者把整张桌子拉进记忆中并不是一种好习惯,我同意。
我是否一直从数据库中提取员工,处理他们的交易,并将历史记录提交到数据库?拉下一个等等?
对后端的调用太多了?
(EF不是我的选择,仍然在ADO.NET中执行原始SQL)
我将不胜感激。
答案 0 :(得分:2)
10000行并不多。如果没有一些极大的varchar或二进制列,内存可以轻松处理。不要被良好的练习“规则”完全锁定。
另一方面,考虑stored procedure。然后所有处理将在服务器上本地完成。
编辑:如果以上都不是一个选项,请尝试流式传输结果。例如,在阅读查询时,请保存ConcurrentQueue
中的每一行或类似的内容。在执行查询之前,启动另一个线程或BackgroundWorker
检查队列中的新项目,并将结果同时保存到另一个SqlConnection
上。查询完成后,工作将完成,队列有Count
0。
答案 1 :(得分:1)
使用ROW_NUMBER()
结帐。这可以由程序使用,以允许使用' x'基本上浏览大表。一次行数。然后,您可以想象使用相同的方法来批量处理您的工作,例如,每次1000行。
有关详细信息,请参阅this链接。