一般来说,任何事情
SELECt * FROM都是不好的做法,但它也可能导致您不得不撤回比实际需要更多的数据。转换仅对几列进行操作,返回的列数比要求的多吗?考虑替换为:
private IEnumerable<Respondent> getListRespondentWithStatuts(string db) { return query("select ResRespondent, ResActive, ResCodeResult, Resphone, ResCompleted from " + db + ".dbo.respondent"); }此外,防止 SQL 注入攻击;为 SQL 查询连接字符串是非常危险的。
从 DataReader 中提取数据时,我发现使用非命名查找效果最好:
var respondent = new Respondent { CodeRépondant = sqlDataReader.GetString(0), IsActive = sqlDataReader.IsDBNull(1) ? (Boolean?)null : sqlDataReader.GetBoolean(1), CodeRésultat = sqlDataReader.GetString(2), Téléphone = sqlDataReader.GetString(3), IsUnContactFinal = sqlDataReader.IsDBNull(4) ? (Boolean?)null : sqlDataReader.GetBoolean(4) };我已经很久没有明确测试性能差异了;但这曾经产生了显着的差异。序数检查不必进行命名查找,也避免了装箱/拆箱值。
除此之外,没有更多信息很难说......你需要所有20,000条记录吗?
更新
运行一个包含 300,000 条记录的简单本地测试用例,并将加载所有数据的时间减少了近 50%。我想这些结果会因检索的数据类型而异;但它仍然对整体执行时间产生影响。话虽如此,在我的环境中,我们正在谈论从 650 毫秒下降到 300 毫秒多一点。
笔记
如果
respondent是视图,则可能“非常慢”的是数据库构建结果集;尽管数据读取器会在记录可用时立即开始处理信息,但最终的瓶颈将是数据库本身和/或网络延迟。除了上述优化之外,除非您可以索引视图/表以优化查询和/或减少所需的信息,否则您对代码无能为力。



