应用场景:

本周在进行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. PhpWind 8.7中禁止后台管理员随意修改会员用户名功能

    有人反映PHPWind 8.7中后台可以直接修改用户名的功能太过随意,干脆禁掉. OK,研究一下他的代码,admin/usermange.php  tempalate/admin/usermange. ...

  2. 默认选中ComboBox的某一项

    如: 让它选中“统计今天”(控件Name为cobListTime) 方法: 1.cobListTime.Text = cobListTime.Items[0].ToString();//默认选中第一个 ...

  3. .NET Core的“dotnet restore”、“dotnet build”和“dotnet run”命令都是用来干什么的?

    dotnet restore 源代码:https://github.com/dotnet/cli/tree/rel/1.0.0/src/dotnet/commands/dotnet-restore 入 ...

  4. 【翻译】Netscaler真实表现性能调整

    源地址:https://msandbu.wordpress.com/2014/10/31/netscaler-and-real-performance-tuning/ 作者显然不是以英语为母语的,所以 ...

  5. log4net学习笔记

    一直想找一个好用的日子类,今天偶然的机会看到了log4net这个类库,过来学习一下. log4net是.NET框架下的一个日子类库,官网是http://logging.apache.org/log4n ...

  6. 参加:白帽子活动-赠三星(SAMSUNG) PRO....

    参加:白帽子活动-—赠三星(SAMSUNG) PRO.... Everybody~小i在这里提前祝大家国庆假期愉快,咱们期待已久的国庆活动终于开始拉,下面进入正题,恩,很正的题! 活动地址:http: ...

  7. App开发流程之Xcode配置和本地化

    补充一点遗漏的Xcode配置. 1.偏好设置.Xcode的菜单栏Xcode -> Preference Fonts & Colors可以自定义编码区和控制台的背景.字体. Text Ed ...

  8. DOM解析XML文件

    1.首先把第三方代码拖进工程 GDataXMLNode.h和GDataXMLNode.m这两个文件放进工程里面 2.引入libxml2库文件 3.将GDataXMLNode.h文件中的这两个东西在工程 ...

  9. 安卓第六天笔记--ListView

    安卓第六天笔记--ListView 1.AdapteView AdapteView 继承ViewGroup它的本质是容器 AdapterView派生了3个子类: AbsListView AbsSpin ...

  10. OC小实例关于init方法不小心的错误

    *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...