我使用的是VSTS2008+ C# + .Net 3.5 + SQL Server2008+ ADO.Net。如果我使用ADO.Net的DataTable从数据库装入一个表,并且在数据库表中,我在该表上定义了两个索引。我的问题是,在ADO.Net DataTable上,是否有相关的索引(和我在物理数据库表上创建的索引一样)来提高DataTable上的某些操作性能?
先谢谢你,乔治
发布于 2009-07-10 13:40:02
乔治,
答案是否定的。
实际上,可以在内部使用某种类型的索引,但仅作为实现细节。例如,如果您创建了一个外键约束,那么它可能会得到索引的帮助。但这对开发人员来说无关紧要。
发布于 2014-11-21 23:08:45
不是,但可能是。
您可以使用DataView在DataTable上设置自己的索引。当您更改表时,将重新构建DataView,因此索引应该始终是最新的。
我为我自己的应用程序做了一些工作台测试。我使用DataTable来近似Boost MultiIndexContainer。要在名为"Author“的列上创建索引,我初始化DataTable,然后初始化DataView...
_dvChangesByAuthor =
new DataView(
_dtChanges,
string.Empty,
"Author ASC",
DataViewRowState.CurrentRows);
然后,要从表中按作者拉取数据,可以使用视图的FindRows函数...
dataRowViews = _dvChangesByAuthor.FindRows(author);
List<DataRow> returnRows = new List<DataRow>();
foreach (DataRowView drv in dataRowViews)
{
returnRows.Add(drv.Row);
}
我随机创建了一个大的DataTable,并使用DataTable.Select()、Linq- to -DataSet (通过导出到list来强制执行)和上面的DataView方法运行查询。DataView方法轻松取胜。Linq有5,000个滴答,Select有超过26000个滴答,DataView有192个滴答……
LOC=20141121-14:46:32.863,UTC=20141121-14:46:32.863,DELTA=72718,THR=9,DEBUG,LOG=Program,volumeTest() - Running queries for author >TFYN_AUTHOR_047<
LOC=20141121-14:46:32.863,UTC=20141121-14:46:32.863,DELTA=72718,THR=9,DEBUG,LOG=RightsChangeTracker,GetChangesByAuthorUsingLinqToDataset() - Query elapsed time: 2 ms, 4934 ticks; Rows=65
LOC=20141121-14:46:32.879,UTC=20141121-14:46:32.879,DELTA=72733,THR=9,DEBUG,LOG=RightsChangeTracker,GetChangesByAuthorUsingSelect() - Query elapsed time: 11 ms, 26575 ticks; Rows=65
LOC=20141121-14:46:32.879,UTC=20141121-14:46:32.879,DELTA=72733,THR=9,DEBUG,LOG=RightsChangeTracker,GetChangesByAuthorUsingDataview() - Query elapsed time: 0 ms, 192 ticks; Rows=65
所以,如果你想在一个DataTable上建立索引,我建议你使用DataView,如果你能处理这样一个事实:当数据改变时,索引会被重新构建。
发布于 2012-04-29 14:53:46
您可以为datatable创建主键。如果你在主键字段中搜索,过滤操作会得到很大的提升。请查看此链接:here
https://stackoverflow.com/questions/1109550
复制相似问题