sql – 大量的UPDATE查询减慢了页面

我正在阅读并验证通过我们的ASP.net网站(用VB.Net编码)提交的大型固定宽度文本文件(范围从10-50K行).我对文件进行了初始扫描,以检查基本问题(行长等).然后我将每行导入MS SQL表.每个数据库行基本上由record_ID(主要,自动递增)和大约50个varchar字段组成.

插入完成后,我在文件上运行验证函数,该函数根据一系列标准(修剪长度,数字,范围检查等)检查每行中的每个字段.如果在任何字段中发现错误,它会将记录插入到Errors表中,该表具有error_ID,record_ID和错误消息.此外,如果字段以特定方式失败,我必须在该字段上执行“重置”.重置可能包括消隐整个字段,或者只是用另一个值替换该值(例如,用一个具有所有非法字符取出的新字符串替换该字符串).

我有一个5000行测试文件.上传,初始检查和导入大约需要5-6秒.详细的错误检查并插入Errors表大约需要5-8秒(此文件中有大约1200个错误).但是,对于需要重置的750个字段,“重置”部分大约需要40-45秒.当我注释掉重置函数(立即返回而没有实际调用UPDATE存储过程)时,过程非常快.重置打开后,页面需要50秒才能返回.

我的UPDATE存储过程使用http://sommarskog.se/dynamic_sql.html中的一些推荐代码,它使用CASE而不是动态SQL:

UPDATE dbo.Records
SET    dbo.Records.file_ID = CASE @field_name WHEN 'file_ID' THEN @field_value ELSE file_ID END,
.
. (all 50 varchar field CASE statements here)
.
WHERE dbo.Records.record_ID = @record_ID

有什么方法可以帮助我在这里表现.我能以某种方式将所有这些UPDATE调用分组到一个事务中吗?我应该以某种方式重新处理UPDATE查询吗?或者仅仅是750 UPDATE的数量,而且事情只是很慢(它是一个带有8GB内存的四进制服务器).

任何建议赞赏.

最佳答案 不要在sql中这样做;在代码中修复数据,然后进行更新.

如果您有sql 2008,那么请查看表值参数.它使您能够将整个表作为参数传递给s’proc.从他们那里你只需要一个insert / update或merge语句

点赞