我有一个应用程序可以执行SQL并将一组数据加载到数据表中。作为处理的一部分,有6或7个DataTable.Select()来过滤一些数据。每个需要处理的项目需要300毫秒。有5000件物品要处理,所以需要25分钟。这是不可接受的。
创建POCO并将它们加载到List中然后使用LINQ查询列表比使用DataTable.Select更快吗?
由于
更新:我已经钻了更多,有2个数据表,每个数据包有大约15000条记录。用于填充数据表的2个查询各占一秒。然后花费25分钟在Dictionary的values属性中循环超过5000个项目并执行5 DataTable.Select的
例如/
foreach (OutputRecord Mailpiece in DictionaryMailpieces.Values)
{
try
{
DataRow[] R = DataTable1.Select("MAILPIECE = " + Mailpiece.MailpieceSetSequenceNumber + " AND (STATUS = 4034 OR STATUS = 4037)", "DAL_DATE desc");
if (R != null && R.Length > 0)
{
}
}
catch
{
}
}
答案 0 :(得分:5)
有趣的是,没有与您的问题相关联的“SQL”标签。我建议,您将学习如何使用SQL语言及其优点。根据您的说法,您可能会使用您的代码创建大量Cartesian products,而不是利用Relational Database工具(连接,索引等)
无论使用何种语言或平台,使用DataTables或列表或类似内容的交叉连接都会导致严重的性能下降。
也就是说,你可以使用LINQ,因为它能够生成智能SQL(动态),但你仍然希望避免所有ToList(),ToArray()和IEnumerable(T)上的类似扩展方法召唤所有底层数据(保持端到端可枚举,并尽可能利用“对象流”)。如果您真正了解什么是关系数据库以及如何有效地使用它,那么您将成为更好的LINQ开发人员。
答案 1 :(得分:2)
几乎任何东西都比操作ADO.NET DataTable
更快 - 它们不是为任何意义上的快速检索而设计的。您还应该将对象放入适当的数据结构中; DataTable
是行的红黑二叉树,所以如果你不想这样,你就不应该使用它。
如果您只是将DataTable
用作带字段的行的连续集合,那么只需将DataTable
替换为{{{}},您就可以看到加速因子为2或更高的因子1}}并使用List<T>
来电替换您的Select
来电,但这取决于您使用它做了什么。
Where
中的5000个项目进行排序或过滤,这意味着任何接近300毫秒的成本,所以瓶颈可能是无关的。
答案 2 :(得分:0)
创建POCO并将它们加载到List中然后使用LINQ查询列表比使用DataTable.Select更快吗?
我们不知道,你没有给我们足够的信息。我们不知道你的方法是如何编码的(也许你的代码中有一个错误的Thread.Sleep(300)
;我们无法分辨。)
更重要的是,我们需要知道瓶颈在哪里。要弄明白,你需要一个分析器。得到一个,然后一旦你知道瓶颈是什么,我们可以帮助你找到一些额外的性能。
也就是说,切换到LINQ可能不会单独成为解决您的性能问题的方法。还有其他错误,是否使用DataTable
和LINQ进行编码大多无关紧要。性能提升将来自对您的问题采取正确的攻击计划; DataTable
和LINQ只是实施攻击计划的方法。
答案 3 :(得分:0)
使用LINQ很可能无法提供巨大的速度提升。话虽如此,您可以使用PLINQ来简化处理的并行化,这可以使其在多核系统上更好地扩展。当使用POCO而不是DataTable时,这往往更简单,因为DataTable不是线程安全的,并且具有并发性问题。
话虽如此 - 我怀疑对整个过程进行分析会给你一个更好的潜在改进,因为它可以让你找到并纠正任何瓶颈。如果没有特定的瓶颈,并且该过程只需要大量的原始处理,则缓存也可能有所帮助。此外,将数据保留在数据库上并使用某种形式的ORM也可能有所帮助,因为“6或7”过滤器操作可以在可伸缩服务器上运行,而不是在本地运行。所有这些都高度依赖于您的数据和算法的性质,因此需要仔细考虑以确定它是否有益或总体上是有害的。