C#基础 之 DataTable操作性能优化
2014-08-22 16:18
1486 查看
DataTable合并
// 一般方法,性能不好 DataTable[] srcTables = ... ; foreach( DataTable src in srcTables ) { dest.Merge( src ) ; } // 推荐方法,速度是上面的100倍 DataTable[] srcTables = ... ; foreach( DataTable src in srcTables ) { foreach( DataRow row in src.Rows) { dest.ImportRow( row ) ; } }
DataTable过滤
// 一般方法,性能不好 DataView dv = dt.DefaultView ; dv.RowFilter = filter ; DataTable result = dv.ToTable() ; // 推荐方法,有数十倍的性能提高。 DataRow[] rows = dv.Select( filter ) ; foreach( DataRow row in rows ) { result.ImportRow(row) ; }
场景:
表A,存储股票的最高价信息, 表B存储股票最低价信息SecurityCode | High | SecurityCode | Low |
000001.SZ | 20 | 000001.SZ | 18.5 |
000002.SZ | 26 | 000002.SZ | 56 |
解决方案一:性能不好,问题出现在Select方法上
新建一张含有这三个字段的DataTable表C,然后复制Security字段,然后遍历另外两张表,对其采用Select方法查找对应的SecurityCode,然后复制给C中对应字段。
解决方案二:
替换了Select方法,创建了一个类型为Dictionary<String,DataRow>的包含目标合并后DataTable对象的所有行的结构C,其中关键字为SecurityCode,DataRow为包含SecurityCode,High,Low三列数据的行。在合并的时候,直接遍历表A的所有行,然后判断在C中是否包含该行中的SecurityCode,如果包含,取出,直接赋值。然后遍历表B。整个过程使得DataTable合并的效率至少提高了10倍。
性能分析
DataTable提供了两个查询数据的接口,DataTable.Select和DataTable.Rows.Find方法。DataTable的Select方法通过传入一系列条件,然后返回一个DataRow[ ]类型的数据,他需要遍历整个表,然后挨个匹配条件,然后返回所有匹配的值。
DataTable.Rows的Find查找第一个匹配上的唯一一条记录,仅对主键字段进行检索。在指定了主键的基础上,查找会采用二叉树的方式查找,效率高。要创建主键,需要指定DataTable的PrimaryKey字段如下:dtA.PrimaryKey = new DataColumn[] { dtA.Columns["SecurityCode"] };
在数据填充完成之后,设置主键要比在填充数据之前设置主键效率要高的多。
如果仅需要查找某一条记录,使用DataTable.Rows.Find会比DataTable.Select快很多。
创建DataTable然后创建主键与直接创建和该DataTable相同的Dictionary结构相比,创建Dictionary所需要的时间要少的多,而且几乎不随着记录条数规模的变大而变大。
DataTable.Select 方法在仅对主键进行检索时,设置主键之后比没有主键速度快很多。
LINQ对DataTable的查询效率比DataTale.Select方法要高,但是仍然比DataTable.Rows.Find方法效率要低。
在某些需要频繁操作DataTable查询的时候,要避免在循环体内调用DataTable.Select方法,采用将DataTable转换为等价的Dictionary结构,能够有效解决由于键值重复导致不能创建主键的问题,并且Dicitonary的采用哈希表的方式查找能够极大地提高查询效率。
refer:http://wenku.baidu.com/view/fee93ada58f5f61fb7366624.html
相关文章推荐
- c#基础数据操作之遍历DataTable并输出
- C# 字符串操作——性能优化细节
- Java软件开发基础知识梳理之(3)------JDCB操作数据库性能优化策略
- 【C#基础】DataTable的操作
- C#基础随手笔记之基础操作优化
- C#优化字符串操作(5)--url传递中文的解决方案
- C#优化字符串操作(6)--把123456789转换为12-345-6789的3种方法
- [转载]DataTable操作中的性能问题
- DataTable操作中的性能问题
- ASP.NET技巧:同时对多个文件进行大量写操作对性能优化
- C#优化字符串操作
- C#优化字符串操作(4)--保留2位有效小数及四舍五入
- ASP.NET技巧:同时对多个文件进行大量写操作对性能优化
- DataTable 基础操作一 往DataTable中添加数据
- C#优化字符串操作
- C#优化字符串操作(转)
- C#优化字符串操作(7)--输出21个AAAAAAAAAAAAAAAAAAAAA的巧妙做法
- DataTable操作中的性能问题
- C#操作Excel---基础篇
- C#优化字符串操作【月儿原创】