考虑下面的代码:
Dataview someView = new DataView(sometable)
someView.RowFilter = someFilter;
if(someView.count > 0) { …. }
很多文章都说Datatable.select()比使用DataViews更好,但这些都是VS 2008之前的文章。
Solved: The Mystery of DataView's Poor Performance with Large Recordsets
Array of DataRecord vs. DataView: A Dramatic Difference in Performance
在谷歌上搜索这个主题,我发现一些文章/论坛主题提到了Datatable.Select()本身是相当错误的(不确定),在各种情况下表现不佳。
关于msdn上的这个(Best Practices ADO.NET)主题,建议如果在datatable上定义了主键,则应使用findrows()或find()方法,而不是Datatable.Select()。
这篇文章here(.NET 1.1)对所有三种方法进行了基准测试。但这是针对1.1版本的,所以不确定这些方法现在是否仍然有效。根据这个DataRowCollection.Find()优于所有方法,Datatable.Select()优于DataView. RowFilter。
所以我很困惑,在数据表中查找行的最佳方法是什么,或者没有一种好的方法,根据场景存在多种解决方案?
2条答案
按热度按时间6tdlim6h1#
您正在寻找“在数据表中查找行的最佳方法”,所以我首先要问:“最好的”是什么?我认为,任何技术都有可能比其他技术更适合的场景。
首先,让我们看看
DataView.RowFilter
:DataView在数据绑定方面有一些优势。它非常面向视图,因此具有强大的排序,过滤或搜索功能,但会产生一些开销,并且没有针对性能进行优化。我会选择DataView.RowFilter
用于较小的记录集和/或您利用其他功能的地方(例如,直接将数据绑定到视图)。关于DataView的大多数事实,你可以在旧文章中读到,仍然适用。
第二,如果你只想得到一个结果,你应该选择
DataTable.Rows.Find
而不是DataTable.Select
。为什么?DataTable.Rows.Find只返回一行。本质上,当你指定主键时,会创建一个二叉树。这有一些与之相关的开销,但极大地加快了检索速度。DataTable.Select
比较慢,但是如果你有多个条件,并且不关心索引或未索引的行,那么DataTable.Select
会非常方便:它基本上可以找到所有内容,但没有针对性能进行优化。本质上,DataTable.Select必须遍历整个表,并将每条记录与您传入的条件进行比较。我希望你发现这个小概述有帮助。
我建议看看**this article**,它在性能问题上对我很有帮助。这篇文章包含了它的一些报价。
一个小更新:顺便说一下,这可能看起来有点超出你的问题范围,但它几乎总是最快的解决方案做过滤和搜索的后端.如果你想要的简单性和有一个SQL Server作为后端和. NET 3+在客户端,去LINQ-to-SQL.搜索Linq对象是非常舒适的,并创建在服务器端执行的查询.虽然LINQ-to-Objects也是一个非常舒适,但也较慢的技术.如果你不知道已经...
6ojccjat2#
Thomashaid的文章很好地总结了这一点:
DataView.RowFilter
用于绑定。DataTable.Rows.Find
用于 * 仅 * 按主键搜索。DataTable.Select
用于按多个列进行搜索,也用于指定顺序。避免在一个循环中创建多个DataView并使用它们的RowFilters来搜索记录。这将大大降低性能。
我想补充的是
DataTable.Select
可以利用索引。您可以通过创建DataView并指定排序顺序来在DataTable上创建索引:然后,当你调用
DataTable.Select()
时,它可以在运行查询时使用这个索引。我们已经使用这个技术在我们多次使用同一个查询的地方大大提高了性能。(注意,这是在Linq存在之前。)技巧是为
Select
语句正确定义排序顺序。因此,如果您的查询是“Col1 = 1 and Col2 = 4”,那么您将需要“Col1,Col2”,就像上面的例子一样。请注意,索引的创建可能取决于创建DataView的实际调用。我们必须使用
new DataView(DataTable dt)
构造函数,然后在单独的步骤中指定Sort属性。不同的.NET版本可能会略有不同。