应用场景:

本周在进行SIT,我帮助仅有的一个测试妹妹对部分表进行数据质量验证,第一步需要做的就是比对source与stage表的table definition 与 数据内容的一致性。

本项目使用的是oracle作为DW,source是oracle,sqlserver和xls.

没有权限建立database link, 测试们常用的方法是比对总行数,然后如果数据集太大的话,则抽样比对,导出数据到xls,然后使用beyondcompare进行比对。

如果值出现不同,则需要查找出哪些行的值不同,最少要找出一条具体的值。

我测试的时候发现,手动去做这一些事也是挺费力的。就写了以下的小工具进行辅助测试。

功能:

1.支持从oracle,sqlserver,xlsx中取数据进行比对。

2.对oracle与sqlserver,可采用传统的比对,各自获取一个readonly ,forward 胡datareader,逐行比对。点击CompareData按钮。因为数据库不同找不到统一的方法计算值,oracle中的ora_hash和sqlserver中的hashbyte不一致。

3.对于oracle与oracle的或者是sqlserver对sqlserver的query比对,可以使用GetDiffRange按钮,即二分查找法进行比对。因为相同的数据库可以找到一个方法进行数据比对。

测试数据如下:

在oracle的数据库中执行以下代码,生成测试数据。

--create table mytest(id int, rid int,name varchar2(20));
--create table mytest2(id int, rid int,name varchar2(20)); declare i integer :=1; begin while i<110000 loop insert into mytest(ID,RID,NAME) VALUES(mysequence.nextval,i,'dataitem'||i); i:=i+1; end loop; end ; insert into mytest2 SELECT * FROM mytest order by id; update mytest2 set rid=100 where id=100000; commit; select * from mytest minus select * from mytest2; select count(*) as totalcount, to_char(avg(ora_hash(id||rid ||name))) as avghash from (select id as rn, t.* from mytest t) select count(*) as totalcount, to_char(avg(ora_hash(id||rid ||name))) as avghash from (select id as rn, t.* from mytest2 t) update mytest2 set name='EvanTEst' where id=1000; commit;

Range:可以自己设定,如果是1的话,则直接定位到第一条不同的记录,如果是大于1 则是一个区间值。

表示不同的数据行就是在他们之间。

为了同时支持oracle和sqlserver,我使用库中自带的接口IDbConnection和IDataReader进行开发,可以同时支持oracle和sqlserver and Xlsx.

sql要求:

二分查找需要样本有序,所以需要写成

select count(*) as totalcount, to_char(avg(ora_hash(id||rid ||name))) as avghash from (select id as rn, t.* from mytest t)

的样式,第一个是总行数,第二个要求是里面需要有一个固定列名叫rn。

我使用ora_hash函数对每行的值进行hash,然后求平均值的方式来计算表区间内行的内容是否相同,这是oracle提供的函数。

类似的有函数checksum,但是计算速度要比这个慢许多,尤其是表数据量大的时候。

sqlserver中有hashbyte函数类似。 注意如果不使用to_char函数,则算出的值会溢出,如果放到.net中来承接,会报oci数据溢出的错误,所以to_char也是必须的。

欢迎大家分享BI测试的一些经验心得。

软件下载地址:   files.cnblogs.com/huaxiaoyao/datacompare.rar

主要源码:

 private void compareData2(int start, int end,int total)
{
rtb_log.AppendText(string.Format("comparedata2({0},{1},{2})", start, end, total) + Environment.NewLine);
string tmpsql = " where rn between {0} and {1} ";
if (total == )
{
dr1 = getDataReader(conn, rtx_sql.Text);
dr2 = getDataReader(conn2, rtx_sql2.Text);
}
else
{
dr1 = getDataReader(conn, rtx_sql.Text + string.Format(tmpsql, start, end));
dr2 = getDataReader(conn2, rtx_sql2.Text + string.Format(tmpsql, start, end));
}
//assume the dr schema totalcount,avghash
bool isdiff = false;
while (dr1.Read() && dr2.Read())
{
if (total == ) {end= total = dr1.GetInt32(); }
for (int col = ; col < dr1.FieldCount; col++)
{
if (!dr1.GetValue(col).ToString().Equals(dr2.GetValue(col).ToString())
||
!(dr1.IsDBNull(col) == dr2.IsDBNull(col))
)
{
isdiff = true;
}
}
}
dr1.Close();
dr2.Close();
//if isdiff=true the split the totalcount two part if (isdiff)
{
if ((end - start < range)) return;
compareData2(start, (start + end) / , end);
}
else //if same
{
if (start == end) end = total;
compareData2(end, total, total);
} }

BI测试工具之跨数据库数据对比,支持oracle,sqlserver的更多相关文章

  1. Oracle Job定时任务详解、跨数据库数据同步

    业务需求,需要与A公司做数据对接,我们公司用的Oracle,A公司用的SQL Server数据库,如何跨数据库建立连接呢?这里使用的是DBLink,不会配置的请看我的另外一篇博客:https://ww ...

  2. SQL SERVER 2000/2005/2008数据库数据迁移到Oracle 10G细述

    最近参与的一个系统涉及到把SQL Server 2k的数据迁移到Oracle 10G这一非功能需求.特将涉及到相关步骤列举如下供大家参考: 环境及现有资源: 1.OS: Windows 7 Enter ...

  3. 数据库数据对比自动生成sql

    1.故事背景 有一次迭代步入尾声,提交给用户测试,系统管理员在测试环境中初始了一些数据,然后在上线的时候系统管理员再去正式环境初始这一些数据,然而这次数据太多了,说了一次:”为什么要初始化两次?“ 你 ...

  4. .NET LINQ 实现跨数据库数据的整合

    如果要在不同的数据库之间,要把数据整合到一起,或者对数据进行统计分析的话,实现起来比较麻烦. 一般情况下我们第一时间想到的方法是通过前置机实现,在前置机上安装一个数据库和同步数据程序,定时的把数据同步 ...

  5. 如何完成dedecms外部数据库调用|跨数据库数据调用

    第1步:打开网站include\taglib文件夹中找到sql.lib.php文件,并直接复制一些此文件出来,并把复制出来的这个文件重命名为mysql.lib.php. 注:mysql.lib.php ...

  6. OPENDATASOURCE读取远程数据库数据中文乱码问题-sqlserver R2

    insert into kraft_sync_Store(StoreName,StoreCode,Province,PrefectureCity,CountyCity,Region,Area,Unit ...

  7. BI测试

    BI概念: 商业智能(Business Intelligence 简称BI),指数据仓库相关技术与应用的通称.指利用各种智能技术,来提升企业的商业竞争力.是帮助企业更好地利用数据提高决策质量的技术,包 ...

  8. 转: 用 Go 写一个轻量级的 ldap 测试工具

    前言 这是一个轮子. 作为一个在高校里混的 IT,LDAP 我们其实都蛮熟悉的,因为在高校中使用 LDAP 来做统一认证还蛮普遍的.对于 LDAP 的管理员而言,LDAP 的各种操作自然有产品对应的管 ...

  9. oracle 压力测试工具benchmarksql

    TPC-C测试 TPC-C 于 1992 年 7 月 23 日认可为新的基准测试.TPC(Transaction Processing Performance Council,事务处理性能委员会)-C ...

随机推荐

  1. Python基础:序列

    一.概述 序列类型(Sequence Types)类似于C中的数组,它是包含一组成员的连续列表,这些成员紧邻排列,并且可以通过序号(下标偏移量)访问其中的一个或多个成员.序列类型的示意图如下所示: P ...

  2. jquery实现网页选项卡

    这个功能在现在的网站中使用较为普遍,就是以选项卡的形式来对一些内容做了分类.,比如下面的天猫商城. 下面的源码是仿照天猫写的一个选项卡,实现起来的效果如下. 主要是利用我们在点击相应板块是触发它的单击 ...

  3. iis到w3wp的数据流及工作原理

    HTTP.sys->IO线程-CLR线程池中的worker线程处理 IO线程只负责把请求交给Worker线程或者放入进程池级别的队列,然后又去HTTP.SYS的队列中处理其它的请求

  4. 世界上不存在什么RedBSD,SuseBSD或者ArchBSD,Turb...

    世界上不存在什么RedBSD,SuseBSD或者ArchBSD,TurboBSD之类的东西.

  5. 【转】 StringUtils中 isNotEmpty 和isNotBlank的区别

    [转自]http://blog.csdn.net/foamflower/article/details/5713604 isNotEmpty将空格也作为参数,isNotBlank则排除空格参数 Str ...

  6. Hibernate的缓存技术详解

    转载注明出处:http://www.cnblogs.com/xiaoming0601/p/5882980.html 一.什么是缓存: 并不是指计算机的内存或者CPU的一二级缓存:缓存是指为了降低应用程 ...

  7. ahjesus根据身份证号码获取相关信息(生日,省市县,性别)

    使用说明: //出自http://www.cnblogs.com/ahjesus 尊重作者辛苦劳动成果,转载请注明出处,谢谢! var idCard = new IdCard();var msg = ...

  8. webpack学习(入门基础)

    webpack的学习webpack是什么?1:加载模块(将JS.sass/less.图片等作为模块来处理使用) 2:进行打包 webpack的优势?1:webpack以commonJS(JS的规范)的 ...

  9. Lync 客户端:无法登陆到Lync,验证服务器中的证书时遇到问题

    安装完Lync客户端后,运行时Lync客户端时,报出如下错误: [原因解析] Lync客户端没有正确安装CA证书链. [解决办法] 第一种方法:将计算机加入域. 第二种方法:不加入域的处理方法: 1. ...

  10. 更轻量的 View Controllers

    iew controllers 通常是 iOS 项目中最大的文件,并且它们包含了许多不必要的代码.所以 View controllers 中的代码几乎总是复用率最低的.我们将会看到给 view con ...