数据加载的性能测试

在数据仓库(DW)项目中ETL是必不可缺少的工具。所谓ETL指的是数据抽取(Extract)、转换(Transform)、清洗(Cleansing)、装载(Load)。大多数接触ETL工具设计的人可能觉得转换(Transform)是设计的重点。在处理转换(Transform)环节的时候采用局部优化的策略,比如并发线程来提高转换速度,其实我个人观点并不赞同,在我接触过移动仓库项目中转换(Transform)通常只不过是一些substr与trim操作,现在硬件CPU的缓存基本都在2M以上,假设有100个这样的操作在缓存里也只不过才300几k,而用线程产生的时间片所占的比率则大了几倍去了。
个人认为ETL重要的环节依次排列下来是:清洗(Cleansing)、装载(Load)、抽取(Extract)、转换(Transform).
清洗(Cleansing)是保证数据质量的一个环节。数据质量问题具体表现为正确性、完整性、一致性、完备性、有效性、时效性和可获取性等几个特性。呵呵这是理论叙述说的具体一点就是:
空值处理可捕获字段空值,进行加载或替换为其他含义数据,并可根据字段空值实现分流加载到不同目标库。
  规范化数据格式 可实现字段格式约束定义,对于数据源中时间、数值、字符等数据,可自定义加载格式。
  验证数据正确性 可利用Lookup及拆分功能进行数据验证。例如,主叫号861084613409,进行区域码和电话号码分解后,可利用Lookup返回主叫网关或交换机记载的主叫地区,进行数据验证。
  数据替换对于因业务因素,可实现无效数据、缺失数据的替换。
  Lookup 查获丢失数据 Lookup实现子查询,并返回用其他手段获取的缺失字段,保证字段完整性。
  这里先概括的说到这里。
其实在ETL里面最让人头疼的就是装载(Load),因为这里牵扯到一个关键的问题就是性能。怎样让数据Load的最快才是ETL工具设计成功与否的一个标准。于是我把目前我所知道的数据加载方式做了个测试实验。下面是测试方式与结果:
测试环境:
OS : Windows XP SP2
DataBase: Mysql 4.1
Program Language:Java (JVM 1.6 b108)

首先我先在Mysql下的Test数据库中建立了2个表如下:
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| testspeed1     |
| testspeed2     |
+----------------+

2个表的结构都一样包含3个字段无索引、主键。
mysql> desc testspeed;
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| Filed1 | varchar(20) | YES  |     | NULL    |       |
| Filed2 | varchar(20) | YES  |     | NULL    |       |
| Filed3 | varchar(20) | YES  |     | NULL    |       |
+--------+-------------+------+-----+---------+-------+

然后写了一个java程序往testspeed1中插入200w条测试数据:
程序如下:
//通过JDBC批量加载数据
public static void main(String[] args){
......
......
 begin = System.currentTimeMillis();
 PreparedStatement stmt = conn.prepareStatement("insert into
    TestSpeed" +
    "(filed1,filed2,filed3) values (?,?,?)");
    for(int i=0;i<2000000;i++)
    {
    stmt.setString(1,i+"");
    stmt.setString(2,i+"");
    stmt.setString(3,i+"");
    stmt.executeUpdate();
   }
end = System.currentTimeMillis();
System.out.println("Cost Time: "+(end - begin) / 1000.0);
......
......
}

运行结果 : 372.189 (秒) 约 6分12秒

然后利用mysql将数据直接到出成文本存到D:/Date.txt

mysql> select * into outfile "D:/Date.txt" fields terminated   ->  by ',' enclosed by
    ->  '"' lines terminated by '/r/n' from TestSpeed1;
Query OK, 2000000 rows affected (5.59 sec)
约 5.6秒

接着我用JDBC直接读取数据来比较上面用mysql直接导出的性能差异
程序如下:
public static void main(String[] args){
......
......
 begin = System.currentTimeMillis();
Statement stmt = conn.createStatement();
  rs = stmt.executeQuery("select * from TestSpeed1;");
    while (rs.next()){    
   }//这里不做任何操作
end = System.currentTimeMillis();
System.out.println("Cost Time: "+(end - begin) / 1000.0);
......
......
}
运行结果:9.39 秒

再接着我用Mysql的Load Data来与JDBC批量加载数据做比较
这次我将上面导出的数据导回到TestSpeed2中
mysql> LOAD DATA LOCAL INFILE 'D:/Date.txt' INTO
-> TABLE   TestSpeed2 FIELDS termina
    ->ted by ',' enclosed by '"' lines terminated by '/r/n';
Query OK, 2000000 rows affected (7.20 sec)
Records: 2000000  Deleted: 0  Skipped: 0  Warnings: 0
约 7.3  秒

最后将结果总结以下:
操作   Java JDBC     mysql 
查询     9.39秒            5.6秒 
插入    6分12秒         7.3秒 

可见JDBC来操作数据其实并不快,在数据装载(Load)过程中用数据库的Load过程可能更好些。
 

时间: 2024-10-13 21:31:41

数据加载的性能测试的相关文章

提高数据加载速度的常用方法

数据加载是数据库应用开发和测试中经常遇到的需求场景.如果要加载的数据量很大,加载的性能往往会成为瓶颈.最近又遇到了一个典型的数据加载场景,顺手总结一下相关的经验. 综合来看,提高加载速度的办法主要有: 1 优化表结构和定义 1.     表定义中避免采用操作代价较高的数据类型,例如在允许的情况下用 INTEGER 或 DOUBLE 代替 DECIMAL. 2.     延迟进行约束或完整性检查,例如在数据加载之后再创建索引和外码约束等. 3.     针对性的做一些物理参数调优,例如调整数据库页

SWF关于远程源和允许跨域数据加载

加载|数据 与 HTML 页面类似,SWF 文件是用于捕获和显示信息的窗口.然而,SWF 文件可以在浏览器中保持加载状态,同时用新信息持续更新而不必重新加载整个页面.使用动作脚本函数和方法,可以向服务器端脚本.文本文件以及 XML 文件发送信息,也可从它们那里接收信息. 此外,服务器端脚本可从数据库中请求特定信息,然后将其转发给 SWF 文件.可用多种不同的语言撰写服务器端脚本:其中最常用的是 CFML.Perl.ASP (Microsoft Active Server Pages) 和 PHP

nhibernate数据加载之Criteria加载

加载|数据 Criteria是通过一组条件表达式(Expression)来加载数据的,它返回满足条件的对象集合. 主要接口为ICriteria,实现为CriteriaImpl类,此类加有Internal修饰,因此不能在程序集外显示创建,nhibernate在session对象中为我们提供了一个方法CreateCriteria,此方法返回ICriteria接口. 这里列出了ICriteria接口的一些方法:SetMaxResults:设置返回的最大结果数,可用于分页:SetFirstResult:

oracle的sql loader数据加载工具

SQL*LOADER是ORACLE的数据加载工具,通常用来将操作系统文件迁移到ORACLE数据库中.SQL*LOADER是大型数据 仓库选择使用的加载方法. 在NT下,SQL*LOADER的命令为SQLLDR,在UNIX下一般为sqlldr/sqlload. 如执行:d:/oracle>sqlldr SQL*Loader: Release 8.1.6.0.0 - Production on 星期二 1月 8 11:06:42 2002 (c) Copyright 1999 Oracle Corp

WorldWind系列十四:DEM数据加载和应用——以SRTM为例(上)

DEM应用在WW的三维表现中占有很重要的位置,跟影像数据同等重要!幸好影像和DEM的加载和处理原理上几乎一致,对基于WW搞GIS三维开发来说是件好事,理解好任何一种,另一种触类旁通!前一篇,主要从功能上做了简单入门介绍,该篇将从代码级别分析WW内置的SRTM的DEM数据加载和应用,下一篇讲从二次开发角度上讲解如何处理.配置自己的影像和DEM数据.呵呵,因为DEM部分很重要,且是放假期间我也有时间,争取篇篇精彩! 两个缩写词介绍:因为这两个缩写词常出现,知道是什么缩写,就不觉得神秘啦! SRTM:

表单-Extjs 怎么控制combo 数据加载与赋值的先后顺序

问题描述 Extjs 怎么控制combo 数据加载与赋值的先后顺序 在form 表单中,有多个combo 下拉框, 使用 form.getForm().load() 方法请求数据并为表单赋值, 这样会造成 combo 数据还没有加载完就给 combo 赋值, 会导致无法赋上值, 如果 各个combo 还有级联关系就更加恼火了, 各位大神有不有解决办法诶---怎么控制combo 数据加载与赋值的先后顺序: 解决方案 Ext.ajax加载数据存储进入变量中,用loadReocrd方法加载,combo

jsp-将JSP网页上的数据加载到word模板中然后发送到指定的邮箱

问题描述 将JSP网页上的数据加载到word模板中然后发送到指定的邮箱 现在需要做一个简单的页面应用,个人以前很少做这种.就是在一个JSP页面上填写相关的信息,然后将信息获取填充到给定的word文档中,最后将word文档发送到指定的邮箱. 上面的是简单的需求.我分析了下,可以分为三步:第一.按照word文档制作一个JSP页面,第二.将页面上的数据提取然后写入到word中,第三.发送邮件. 现在感到最困难的就是第二步,写数据到word中,不知道有没有什么好的方法可以推荐,或者有类似的项目给我借鉴下

sencha touch dataview 数据加载问题

问题描述 sencha touch dataview 数据加载问题 在使用sencha touch时遇到个问题.dataview 控件第一次加载数据能显示,第二次加载数据无法显示,这时我随便点一下界面任意一个控件(不执行任何操作)这时数据又显示出来了... 查阅了很多资料都没解决. 解决方案 http://blog.sina.com.cn/s/blog_6158283f0100uep4.html

RecyclerView 的数据加载 包括分页加载 和刷新加载 头尾部的提示处理

问题描述 RecyclerView 的数据加载 包括分页加载 和刷新加载 头尾部的提示处理 RecyclerView 如何实现分页加载网络数据和刷新加载 头尾部的提示处理?