【发布时间】:2011-02-19 16:52:53
【问题描述】:
我正在阅读和验证通过我们的 ASP.net 网站(用 VB.Net 编码)提交的大型固定宽度文本文件(范围从 10-50K 行)。我对文件进行了初始扫描以检查基本问题(行长等)。然后我将每一行导入到一个 MS SQL 表中。每个 DB 行基本上由一个 record_ID(Primary,自动递增)和大约 50 个 varchar 字段组成。
插入完成后,我在文件上运行一个验证函数,根据一系列标准(修剪长度、非数字、范围检查等)检查每一行中的每个字段。如果在任何字段中发现错误,它会在错误表中插入一条记录,该表有一个 error_ID、record_ID 和一条错误消息。此外,如果该字段以特定方式失败,我必须对该字段进行“重置”。重置可能包括将整个字段置空,或者只是将值替换为另一个值(例如,将字符串替换为删除了所有非法字符的新字符串)。
我有一个 5,000 行的测试文件。上传、初始检查和导入大约需要 5-6 秒。详细的错误检查和插入错误表大约需要 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 内存的四进程服务器)。
任何建议表示赞赏。
【问题讨论】:
-
+1 很好地描述了一个相当复杂的过程
-
您正在查找的列上是否有索引?
标签: sql stored-procedures sql-update