多表SQL记录转CSV性能优化及Azure函数部署适配
代码性能优化方案
核心性能瓶颈在循环内遍历评论表查找匹配项,每次查找都是O(m)复杂度,3万条记录×1万条评论就是3亿次操作,这是拖慢速度的元凶。下面是具体优化方案:
1. 用Dictionary缓存评论数据(最关键优化)
将评论表数据提前加载到Dictionary中,把查找复杂度从O(n*m)降到O(n+m),每次匹配仅需O(1)时间:
// 预处理评论数据到Dictionary,提前截断评论长度 int htmlCommentaryLength = 5000; var commentDict = commentriesDataset.Tables[0].Rows.Cast<DataRow>() .ToDictionary( row => row["CommentaryID"].ToString()!, row => { var comment = row["Comment"].ToString() ?? string.Empty; return comment.Length >= htmlCommentaryLength ? comment[..htmlCommentaryLength] : comment; });
2. 优化数字判断逻辑
原代码用字符遍历判断是否为纯数字,效率低且不准确。改用int.TryParse直接验证,更高效可靠:
string? commentryValue = dr["VariationReasonsCommentary"]?.ToString(); if (!string.IsNullOrEmpty(commentryValue)) { if (!int.TryParse(commentryValue, out _)) { // 非数字,直接写入截断后的原内容 var truncated = commentryValue.Length >= htmlCommentaryLength ? commentryValue[..htmlCommentaryLength] : commentryValue; csvWriter.WriteField(truncated); } else { // 数字ID,从字典快速查找 if (commentDict.TryGetValue(commentryValue, out var comment)) { csvWriter.WriteField(comment); } else { csvWriter.WriteField(string.Empty); } } } else { csvWriter.WriteField(string.Empty); }
3. 缓存DataTable列集合
提前缓存列数组,避免每次循环重复遍历dt.Columns:
// 提前缓存列数组 var columns = dt.Columns.Cast<DataColumn>().ToArray(); // 写入表头 foreach (var dc in columns) { csvWriter.WriteField(dc.ColumnName); } csvWriter.WriteField("Comment"); csvWriter.NextRecord(); // 写入数据行时复用缓存的列 foreach (DataRow dr in dt.Rows) { foreach (var dc in columns) { csvWriter.WriteField(dr[dc]); } // ... 处理Comment列的逻辑 }
4. 优化CSV写入IO效率
- 给StreamWriter设置更大缓冲区,减少磁盘IO次数:
using var writer = new StreamWriter($"C:\\Work\\{fileName}", append: false, bufferSize: 8192); - 部署到Azure函数时,直接写入Blob存储而非本地文件(比如用
BlobClient.OpenWriteAsync获取流),避免本地磁盘瓶颈; - 改用CsvWriter的异步方法(
WriteFieldAsync、NextRecordAsync)配合await,提升异步IO效率。
5. 细节优化
- 简化判空逻辑:
string.IsNullOrEmpty(commentryValue) == false改为!string.IsNullOrEmpty(commentryValue); - Azure函数环境中使用临时存储路径:
Path.Combine(Path.GetTempPath(), fileName),避免本地路径不存在问题。
内容的提问来源于stack exchange,提问作者Ali
相关产品推荐
相关产品推荐

