两表合并优化

需求:

需要将两个字段有部分相同其他不同,且行数都不相同的datatable根据keycolumn合并为一个table。

相当于做了一个left Join。

方法一:

自己写的最原始的方法

优点:在表合并方面能完美达到效果。

缺点:表很大时(几万行开始)速度相当慢,且容易内存溢出。

 1 public static DataTable MergeTable(DataTable dtReturn, DataTable dtMerge, string keyName)
 2         {
 3             foreach (DataColumn dcm in dtMerge.Columns)
 4                 if (!dtReturn.Columns.Contains(dcm.ColumnName))
 5                     dtReturn.Columns.Add(dcm.ColumnName, dcm.DataType);
 6             dtReturn.AcceptChanges();
 7
 8             foreach (DataRow dr in dtReturn.Rows)
 9                 foreach (DataRow drm in dtMerge.Rows)
10                     if (dr[keyName].ToString().ToLower().Equals(drm[keyName].ToString().ToLower()))
11                     {
12                         foreach (DataColumn dc in dtReturn.Columns)
13                             foreach (DataColumn dcm in dtMerge.Columns)
14                                 if (dc.ColumnName.Equals(dcm.ColumnName))
15                                     if (string.IsNullOrEmpty(dr[dc].ToString()))
16                                     {
17                                         dr[dc] = drm[dcm];
18                                         break;
19                                     }
20                         break;
21                     }
22
23             return dtReturn;
24         }

方法二:

优点:代码上用datatable.merge()原生态。

缺点:方法一,表很大时(几万行开始)速度相当慢,且容易内存溢出。

具体代码不贴了,感觉merge的内部机制也是循环插入。

方法三:

优点:速度超快。

缺点:用标示法删除重复的列,担心误删。(标示得体的情况下误删可能性极小,可忽略)

 1      public static DataTable MergeTable(DataTable dtReturn, DataTable dtMerge, string keyName)
 2         {
 3             var result = (from b in dtReturn.AsEnumerable()
 4                           join a in dtMerge.AsEnumerable()
 5                           on b.Field<string>(keyName) equals a.Field<string>(keyName)
 6                           into temp
 7                           from t in temp.DefaultIfEmpty()
 8                           select new { b, t }).ToList();
 9
10             DataTable dtNew = new DataTable();
11             foreach (DataColumn dc in dtReturn.Columns)
12                 dtNew.Columns.Add(dc.ColumnName, dc.DataType);
13             foreach (DataColumn dcm in dtMerge.Columns)
14                 if (!dtNew.Columns.Contains(dcm.ColumnName))
15                     dtNew.Columns.Add(dcm.ColumnName, dcm.DataType);
16                 else
17                     dtNew.Columns.Add(dcm.ColumnName + "[email protected]#$%", dcm.DataType);
18
19             for (int i = 0; i < result.Count; i++)
20             {
21                 DataRow drNew = dtNew.NewRow();
22                 object[] ob = result[i].b.ItemArray;
23                 object[] ot = result[i].t.ItemArray;
24                 object[] oc = new object[ob.Length + ot.Length];
25                 ob.CopyTo(oc, 0);
26                 ot.CopyTo(oc, ob.Length);
27                 drNew.ItemArray = oc;
28                 dtNew.Rows.Add(drNew);
29             }
30             dtNew.AcceptChanges();
31             for (int i = dtNew.Columns.Count - 1; i >= 0; --i)
32                 if (dtNew.Columns[i].ColumnName.Contains("[email protected]#$%"))
33                     dtNew.Columns.RemoveAt(i);
34             dtNew.AcceptChanges();
35             dtReturn = dtNew.Copy();
36
37             return dtReturn;
38         }
至此,完美优化!撒花~~
时间: 2024-10-05 21:19:32

两表合并优化的相关文章

MySQL两表索引优化

建表语句 CREATE TABLE IF NOT EXISTS `class`( `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, `card` INT(10) UNSIGNED NOT NULL, PRIMARY KEY(`id`) ); CREATE TABLE IF NOT EXISTS `book`( `bookid` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, `card` INT(10) UNSIGN

两表合并查询

UNION UNION ALL //Table Attribute Create table student( id int unsigned not null auto_increment, name varchar(20) not null, primary key(id) )ENGINE=InnoDb AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 ; Create table student1( id int unsigned not null auto_in

MySQL数据表合并(两表字段相同)以及数据去重(抄)

数据去重现有两个表 test_01 test_02 其中test_01有重复数据 统计重复数据select count(*) as repeat_count,name from test_01 group by name having repeat_count > 1;1 使用DISTINCT关键字过滤重复数据select distinct name,age from test_01;1 也可以使用GROUP BY过滤重复数据select name,age,gender from test_01

10 表连接优化

本章提要-----------------------------------------查询优化器要确定多张表的连接顺序和连接方法, 目的是通过尽早的过滤不需要的数据, 减少要处理的数据量.本章会介绍3种基本连接方法: 嵌套循环连接, 合并连接, 哈希连接如何选择连接放的的基本建议.----------------------------------------- 10.1 定义    连接树    数据库引擎支持的所有的连接方法都是每次只能处理两个数据集. 它们被称作 左节点 和 右节点,

MySQL两千万数据优化&amp;迁移

最近有一张2000W条记录的数据表需要优化和迁移.2000W数据对于MySQL来说很尴尬,因为合理的创建索引速度还是挺快的,再怎么优化速度也得不到多大提升.不过这些数据有大量的冗余字段和错误信息,极不方便做统计和分析.所以我需要创建一张新表,把旧表中的数据一条一条取出来优化后放回新表: 一. 清除冗余数据,优化字段结构 2000W数据中,能作为查询条件的字段我们是预知的.所以将这部分数据单独创建新的字段,对于有规则的数据合理改变字段结构,比如身份证就是varchar(18).对于不重要的数据我们

20亿与20亿表关联优化方法(超级大表与超级大表join优化方法)

记得5年前遇到一个SQL.就是一个简单的两表关联.SQL跑了几乎相同一天一夜,这两个表都非常巨大.每一个表都有几十个G.数据量每一个表有20多亿,表的字段也特别多. 相信大家也知道SQL慢在哪里了,单个进程的PGA 是绝对放不下几十个G的数据,这就会导致消耗大量temp tablespace,SQL慢就是慢在temp来回来回来回...的读写数据. 遇到这样的超级大表与超级大表怎么优化呢?这篇文章将告诉你答案. 首先创建2个測试表 t1,t2 数据来自dba_objects create tabl

(转)MapReduce 中的两表 join 几种方案简介

1. 概述 在传统数据库(如:MYSQL)中,JOIN操作是非常常见且非常耗时的.而在HADOOP中进行JOIN操作,同样常见且耗时,由于Hadoop的独特设计思想,当进行JOIN操作时,有一些特殊的技巧. 本文首先介绍了Hadoop上通常的JOIN实现方法,然后给出了几种针对不同输入数据集的优化方法. 2. 常见的join方法介绍 假设要进行join的数据分别来自File1和File2. 2.1 reduce side join reduce side join是一种最简单的join方式,其主

大数据技术之MapReduce中多表合并案例

大数据技术之MapReduce中多表合并案例 1)需求: 订单数据表t_order: id pid amount 1001 01 1 1002 02 2 1003 03 3 订单数据order.txt 1001 01 1 1002 02 2 1003 03 3 1004 01 4 1005 02 5 1006 03 6 商品信息表t_product pid pname 01 小米 02 华为 03 格力 商品数据pd.txt 01 小米 02 华为 03 格力 将商品信息表中数据根据商品pid合

Oracle优化——单表分页优化

单表分页优化思路: --创建测试表: SQL> create table t_test as select * from dba_objects; Table created. 如,下面的sql (没有过滤条件,只有排序),要将查询结果分页显示,每页显示10条,如: select * from t_test order by object_id; 例子: 1.分页查询sql语句,如下(通常会采用下面的方法,但是这是错误的分页框架) 语法:select * from (select t.*,row