BI测试工具之跨数据库数据对比,支持oracle,sqlserver
应用场景:
本周在进行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的更多相关文章
- Oracle Job定时任务详解、跨数据库数据同步
业务需求,需要与A公司做数据对接,我们公司用的Oracle,A公司用的SQL Server数据库,如何跨数据库建立连接呢?这里使用的是DBLink,不会配置的请看我的另外一篇博客:https://ww ...
- SQL SERVER 2000/2005/2008数据库数据迁移到Oracle 10G细述
最近参与的一个系统涉及到把SQL Server 2k的数据迁移到Oracle 10G这一非功能需求.特将涉及到相关步骤列举如下供大家参考: 环境及现有资源: 1.OS: Windows 7 Enter ...
- 数据库数据对比自动生成sql
1.故事背景 有一次迭代步入尾声,提交给用户测试,系统管理员在测试环境中初始了一些数据,然后在上线的时候系统管理员再去正式环境初始这一些数据,然而这次数据太多了,说了一次:”为什么要初始化两次?“ 你 ...
- .NET LINQ 实现跨数据库数据的整合
如果要在不同的数据库之间,要把数据整合到一起,或者对数据进行统计分析的话,实现起来比较麻烦. 一般情况下我们第一时间想到的方法是通过前置机实现,在前置机上安装一个数据库和同步数据程序,定时的把数据同步 ...
- 如何完成dedecms外部数据库调用|跨数据库数据调用
第1步:打开网站include\taglib文件夹中找到sql.lib.php文件,并直接复制一些此文件出来,并把复制出来的这个文件重命名为mysql.lib.php. 注:mysql.lib.php ...
- OPENDATASOURCE读取远程数据库数据中文乱码问题-sqlserver R2
insert into kraft_sync_Store(StoreName,StoreCode,Province,PrefectureCity,CountyCity,Region,Area,Unit ...
- BI测试
BI概念: 商业智能(Business Intelligence 简称BI),指数据仓库相关技术与应用的通称.指利用各种智能技术,来提升企业的商业竞争力.是帮助企业更好地利用数据提高决策质量的技术,包 ...
- 转: 用 Go 写一个轻量级的 ldap 测试工具
前言 这是一个轮子. 作为一个在高校里混的 IT,LDAP 我们其实都蛮熟悉的,因为在高校中使用 LDAP 来做统一认证还蛮普遍的.对于 LDAP 的管理员而言,LDAP 的各种操作自然有产品对应的管 ...
- oracle 压力测试工具benchmarksql
TPC-C测试 TPC-C 于 1992 年 7 月 23 日认可为新的基准测试.TPC(Transaction Processing Performance Council,事务处理性能委员会)-C ...
随机推荐
- sql多行转一行,以逗号隔开
--SELECT ff= stuff((select ','+cast(WorkOrderNo as varchar)-- FROM dbo.TB_WorkOrder c -- where tpl.P ...
- SQL SERVER获取数据库文件信息
MS SQL SERVER 获取当前数据库文件等信息,适用于多个版本: SELECT dbf.file_id AS FileID , dbf.name AS [FileName] , s.fi ...
- 用EF6更新数据库时出现外键错误解决方式
在“Package Manager Console”中执行update-database命令,出现异常信息: Introducing FOREIGN KEY constraint 'FK_dbo.Pr ...
- 写给java程序员的c++与java实现的一些重要细微差别
0.其实常规的逻辑判断结构.工具类.文件读写.控制台读写这些的关系都不大,熟悉之后,这些都是灵活运用的问题. 学习c/c++需要预先知道的一个前提就是,虽然有ANSI C标准,但是每个c/c++编译器 ...
- 用Gradle构建时,将密码等敏感信息放在build.gradle之外
密码 在做版本release时你app的 build.gradle你需要定义 signingConfigs.此时你应该避免以下内容: 不要做这个 . 这会出现在版本控制中. signingConfig ...
- Android Studio 项目代码全部消失--出现原因及解决方法
出现原因,自己把项目地址父层目录文件名修改了,导致原来打开的项目位置不对,代码全部消失.这样就只要关闭项目,打开一下你修改路径下的项目即可.因为原来的项目还在原来的路径下寻找,但是原来的路径发生了改变
- Android拍照保存在系统相册不显示的问题
Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); Uri uri = Uri.fromFile(new File(& ...
- 【读书笔记】iOS-Objective-C对C的扩展基础知识
一,Xcode的.m扩展名表示文件含有Objective-C代码,应由Objective-C编译器处理.C编译器处理名称以.c结尾的文件,而C++编译器处理.cpp文件.在Xcode中,所有这些编译工 ...
- 自定义cell
思路就是创建模型,自定义cell,然后在主控制器中完成,首先要观察plist文件: Contact.h #import <Foundation/Foundation.h> @interfa ...
- Swift的7大误区
Swift正在完成一个惊人的壮举,它正在改变我们在苹果设备上编程的方式,引入了很多现代范例,例如:函数式编程和相比于OC这种纯面向对象语言更丰富的类型检查. Swift语言希望通过采用安全的编程模式去 ...