




已阅读5页,还剩5页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
DataTable 操作中的性能问题 最近的一项工作是关于性能提升方面的 要做的第一个事情是要把很多同类型的 DataTabl e 合并到一起 查了很多关于 DataTable 的相关函数以后 我决定用 Merge 函数来合并 这些 DataTable DataTable srcTables foreach DataTable src in srcTables dest Merge src 但是测试的结果让我很是失望 性能不是一般的不好 经过调查发现性能的瓶颈在 Merge 函数这里 后来经过测试 发现如果用下面的代码 DataTable srcTables foreach DataTable src in srcTables foreach DataRow row in src Rows dest ImportRow row 结果让人惊奇的是 下面的代面的速度是上面的代码速度的 100 倍 还做了一个事情 就是对 DataTable 进行 filter 的时候 我的一个同事和我说了以下的代 码 DataView dv dt DefaultView dv RowFilter filter DataTable result dv ToTable 上面的代码是能工作的 但是它的性能一点都不好 后来我把上面的代码改成了 DataRow rows dv Select filter foreach DataRow row in rows result ImportRow row 也有数十倍的性能提高 DataTable 数据检索的性能分析 我们知道在 NET 平台上有很多种数据存储 检索解决方案 ADO NET Entity Framework ASP NET Dynamic Data XML NHibernate LINQ to SQL 等等 但是由于一些 原因 如平台限制 比如说必须基于 NET Framework2 0 及以下平台 遗留的或者第三 方数据接口采用的就是 DataTable 等等 仍然需要使用 DataTable 作为数据存储结构 另一方面 DataTable 比较容易使用 一些数据访问的接口可能直接采用了 DataTable 结 构 在使用 DataTable 进行数据检索的时候 有一些需要注意的地方 这些地方会严重的 影响对数据的检索效率 本人最近工作中需要对大量的 DataTable 进行拼接 接口的数据是以 DataSet 然后里面 放 DataTable 的方式提供的 暂不提是否合理 同时进行多个请求的时 服务端会返回一 个 DataSet 其中包含每个请求的结果 DataTable 这些 DataTable 中有一列相当于 关 键字 列 现在需要按照这个关键字 将这些 DataTable 中的列合并到一个 DataTable 然后展现到界面上来 最开始 我使用的是 DataTable 的 Select 方法来循环遍历拼接实现的 发现很慢 于是 总结了一下对 DataTable 进行查询等操作的一些经验 和大家分享 一 场景 为了简化问题 有两张 DataTable 名为表 A 表 B 字段分别为 表 A 存储股票的最高价信息 表 B 存储股票最低价信息 SecurityCode High SecurityCode Low 000001 SZ 20 000001 SZ 18 5 000002 SZ 26 000002 SZ 56 现在需要 将这两张表拼接到一张表中 这张表有三列字段 SecurityCode High Low 之前采用的方法是 新建一张含有这三个字段的 DataTable 表 C 然后复制 Security 字段 然后遍历另外两张表 对其采用 Select 方法查找对应的 SecurityCode 然后复制 给 C 中对应字段 发现效率很慢 问题出现在 Select 方法上 于是需要进行优化 二 DataTable 的查询效率 DataTable 提供了两个查询数据的接口 DataTable Select 和 DataTable Rows Find 方 法 DataTable 的 Select 方法通过传入一系列条件 然后返回一个 DataRow 类型的数据 他需要遍历整个表 然后挨个匹配条件 然后返回所有匹配的值 很显然在策略上 之前 的 DataTable 拼接采用 Select 方法存在问题 因为我们只需要查找匹配上的一条记录即 可 DataTable Rows 的 Find 查找第一个匹配上的唯一一条记录 在指定了主键的基础上 查找会采用二叉树的方式查找 效率高 要创建主键 需要指定 DataTable 的 PrimaryKe y 字段如下 dtA PrimaryKey new DataColumn dtA Columns SecurityCode 当然 创建主键会增加时间消耗 这也分为在数据填充前创建和数据填充后创建 在数据 量大的情况下 创建主键的消耗是需要考虑进去的 下面的图中显示了在填充数据之前创 建主键 之后创建主键 以及创建 Dictionary 所需的时间 可以看到 ArraySizePreIndex Creation Ti me PostIndex Creation Ti me Dictionary Creation Tim e 10000 50000 100100 500610 10001520 5000107162 10000261425 50000172727131 100000352554447 500000202092895240 1000000433825919517 作图如下 从上图可以得到 1 在填充数据之前创建主键 然后填充数据 比填充数据完之后创建主键消耗的时间 要多 这是由于 创建主键后 再向其中添加数据 会导致需要重新生成索引 这 和数据库中 不适合在频繁变动的字段上创建主键的原理是一样的 在我的笔记本 Win7 32bit CPU T6600 2 0GHZ RAM 2GB 上 为 100 万条记录的 DataTabl e 创建索引大约需要 5 秒钟 所以在数据量大的情况下 需要考虑索引的创建时间 2 创建 DataTable 然后创建主键与直接创建和该 DataTable 相同的 Dictionary 结构 相比 创建 Dictionary 所需要的时间要少的多 而且几乎不随着记录条数规模的 变大而变大 创建完成之后 下面来测试几种情况下的 DataTable 的检索效率 为此 在建立主键和没 有建立索引的条件下 测试了在不同规模下 DataTable Select DataTable Rows Find 的查询速度 由于在 DataTable 比较小的时候 时间不能很好的显示 所以测试采用的单 位是 StopWatch 的 Tick 数 每个方法在数据规模不同的情况下 各执行了 10 次 然后 取平均值 结果如下 ArraySi ze Dictionar y Create Dictiona ry Searc h Table Sel ect Indexed Table Se lect Table Rows Fi nd LINQ 101334025816 502726937827 10051311238939 50021035895111155 1000461411756014328 5000226414841285171540 10000623571680699203354 500002376881501331382615824 100000 4913372597941472631525 500000 25210351154793518130 15831 7 100000 0 4946479273661620930 31571 6 作图如下 可以看到 1 在没有创建主键的条件下 对 DataTable 执行 Select 操作时比较低效的 在建立 主键之后 仅对主键所在列执行 Select 操作 速度提高了很多 这种差距在数据 量大的情况下尤其明显 在集合大小规模为 1000 时 该差异达到了近 20 倍 2 LINQ 对 DataTable 的查询效率比 DataTale Select 方法要高 但是仍然比 DataT able Rows Find 方法效率要低 3 在对主键进行唯一性查找时 我们应该使用 DataTable Rows Find 操作 在 Data Table 建立主键 并且仅对主键进行操作的情况下 Find 方法会比 Select 方法快 3 6 倍 这可能是由于 Select 方法需要对里面的过滤字符串进行解析及判断 因 为 Select 方法可以接受多个条件的查询以及以一些比较复杂的表达式 处理及解 析可能需要耗费一些时间 并且在一般条件下 Select 是完全搜索 即查找整个集 合找到所有满足条件的记录 而 Find 方法则仅对主键字段进行检索 如果没有设 置主键 那么调用 Find 方法就会报错 4 采用 Dictionary 来代替 DataTable 结构来进行检索 能达到最快的速度 且几乎 不受规模的影响 但是在数据量较大的情况下 将 DataTable 转换为对应的 Dicti onary 结构可能需要花费时间 如果操作频繁 诸如在进行多个 DataTable 基于 关键字进行拼接的情况下 对目标 DataTable 使用 Dictionary 的方式进行存储 能够使用 ContainsKey 的基于 Hash 的方式对关键字进行查找 这能极大地提高效率 并且在 DataTable 列有重复字段 不能建立主键的情况 下 可以采用 Dictionary string List 能够解决 DataTable 无法创 建主键 从而导致查找性能下降的问题 三 实施效果 基于上面的分析 在实际中的工作中 替换了 Select 方法 创建了一个类型为 Dictionary 的包含目标合并后 DataTable 对象的所有行的结构 C 其中关键字为 SecurityCode DataRow 为包含 SecurityCode High Low 三列数据的行 在合并的 时候 直接遍历表 A 的所有行 然后判断在 C 中是否包含该行中的 SecurityCode 如果 包含 取出 直接赋值 然后遍历表 B 整个过程使得 DataTable 合并的效率至少提高了 10 倍 四 结语 本文简要介绍了 DataTable 中检索数据的两种方法 DataTable Select 和 DataTable Ro ws Find 方法 在测试方法的执行效率之前介绍了如何为 DataTable 设置主键 并比较了 在数据填充之前和数据填充之后设置主键花费的时间 结果表明 在数据填充完成之后 设置主键要比在填充数据之前设置主键效率要高的多 设置主键之后 比较了在有无主键 的情况下 DataTable Select 方法在仅对主键字段进行过滤时的性能 结果表明 在仅对 主键进行检索时 设置主键之后使用 DataTable Select 方法会
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025企业标准员工合同文本参考
- 聊城招聘考试题型及答案
- 伊宁土工膜的施工方案
- 2025网签版中介工程合同范本
- 水塘水渠养护方案范本
- 2025年酒店禁毒试题及答案
- 拆迁拆除方案范本
- 综合文员考试试题及答案
- 浙江轻质水泥瓦施工方案
- 2025福建龙岩市第一医院医技、行政后勤岗位编外人员招聘7人考前自测高频考点模拟试题及1套参考答案详解
- 行政法知识竞赛题及答案
- 组织工程瓣膜修复研究-洞察及研究
- 自主可控人工智能智能决策系统研究报告
- 2.1《整十、整百数乘一位数的口算和估算》(课件) -2025-2026学年三年级数学上册 苏教版
- 2025年四川基层法律服务工作者执业核准考试综合试题及答案一
- 招商银行ai面试试题及答案
- Z20+名校联盟(浙江省名校新高考研究联盟)2026届高三第一次联考化学及答案
- 中国艾滋病诊疗指南(2024版)
- 大疆无人机培训课件
- (中职)卫生法律法规课程标准课件
- 制冷系统常见的五大故障及解析
评论
0/150
提交评论