公司有个项目,是使用kettle从oracle上统计,再将结果跟oracle中目标表进行对比更新。接手后,走了一些弯路,中间各种尝试都不尽如人意,也学了kettle的一些组件的用法。正好趁着机会记录 一下。

  一、背景:

  需求其实很简单,在源oracle中,有大批量的表,是使用定时调度从其他不同的数据库(oracle,mysql,sybase,dameng,sqlserver)中将 “表信息”,“字段信息”,“注释信息”等元数据表,拉取过来,分别做好编号存储。

  而kettle要实现的功能:

  ① 则是从这些源数据表中,将表名、字段名、字段注释、字段长度、字段类型等信息关联出来。

  ② 并与之前已经做好的一张结果表做关联更新。

  ③ 将“元数据有变更”的表的四元素(type,length,primary,comment)信息进行update。

  ④ 如果该字段已经没有了被删除了,则有专用字段标记为"1"。

  ⑤ 如果是新来的字段,则insert插入目标表。

  二、历程:

  1. 一开始,机敏的同事使用了一个SQL脚本,用了oracle中的 merge using() matched ....用法,——如果查询结果与目标结果的 table_name和 column_name关联上,则直接将四元素update到目标表中;若没关联上,则直接insert到目标表中。

  2. 问题初现: 初步的逻辑相当于:只要关联上,就必须update,这样来说,没有任何变化的字段,也要update一次,造成大量的update其实是可以避免的。而且已删除字段的标记也未实现。

  3. 趟雷:

    ① 最开始,使用kettle的组件来实现SQL中的逻辑,就不贴图了,太长了,而且运行起来的效率低的可怕,后被pass。

    ② 后来尝试,将SQL优化:

      建立临时表;

      join的数据的列裁剪;

      都用了一遍,但是毫无卵用....效率仍然低(在真实生产环境上直接都跑不动了)

    ③ 后来尝试了一个新的用法:  kettle中有个组件叫“合并记录”:  。  这个小老弟看着不起眼,其实很厉害——它可以将两组数据流进行比对,一个原始的,一个“新来的”,用新来的流与原始的流做比对,并在新产生的流中做标记,标记出哪些是没变的,哪些是新加的(new),哪些是删除了的(deleted),哪些是改变了的(changed)。

    当时一看,这不就是为这需求量身打造的组件,直接用起来!

    改造逻辑:

    查询的SQL保留,但是再从目标表查询出全量数据,将这两个流做比对,用“合并记录”的组件将各种情况的记录都标记出来,在后续的流程中可以使用组件来筛选和进行后续的操作。

    改造完成后的图如下

    这样,就将“需要更新”的,“需要插入的”,需要“标记为删除的”分别筛选出来,单独进行更细或者插入的操作了。
    然而,还是出现了新的问题,在“更新”和”同步“

    

    三、总结:

    ① 对于不通的方式,最多2天,不要再深入研究,问题一定不是在整个方向上。

    ② 解决问题要有逻辑性,哪怕在纸上写出来,将问题一个个的罗列,解决,梳理,能对问题有个明确的方向。

    ③ 多上cnblog看看大神的数据库笔记。。。

kettle —— 从 oracle 到 oracle的坑的更多相关文章

  1. Hyper-V安装Oracle Linux6_4 Oracle db 12c并使用rman做异机恢复

    本文记录在Windows Server 2012 R2上安装Oracle Enterprise Linux 6.4以及使用RMAN进行进行异机恢复的过程. Windows服务器增加Hyper-V功能 ...

  2. Streaming data from Oracle using Oracle GoldenGate and Kafka Connect

    This is a guest blog from Robin Moffatt. Robin Moffatt is Head of R&D (Europe) at Rittman Mead, ...

  3. Oracle实例和Oracle数据库(Oracle体系结构)

    --========================================== --Oracle实例和Oracle数据库(Oracle体系结构) --==================== ...

  4. Oracle ORA-01033: ORACLE initialization or shutdown in progress 错误解决办法

    Oracle ORA-01033: ORACLE initialization or shutdown in progress 错误解决办法 登陆数据库时提示 “ORA-01033”错误在命令窗口以s ...

  5. Pre-Query trigger in Oracle D2k / Oracle Forms

    Pre-Query trigger in Oracle D2k / Oracle Forms DescriptionFires during Execute Query or Count Query ...

  6. 【转载】Oracle实例和Oracle数据库(Oracle体系结构)

    免责声明:     本文转自网络文章,转载此文章仅为个人收藏,分享知识,如有侵权,请联系博主进行删除.     原文作者:Leshami      原文地址:http://blog.csdn.net/ ...

  7. Oracle 数据库(oracle Database)Select 多表关联查询方式

    Oracle数据库中Select语句语法及介绍 SELECT [ ALL | DISTINCT ] <字段表达式1[,<字段表达式2[,…] FROM <表名1>,<表名 ...

  8. 搭建一个Oracle到Oracle的Goldengate双向复制环境

    目标:搭建一个Oracle到Oracle的Goldengate双向复制环境(支持DDL+DML). 环境: OS:Red Hat Enterprise Linux Server release 5.5 ...

  9. Oracle 11g oracle客户端(32位)PL/SQL develepment的安装配置

    Oracle 11g+oracle客户端(32位)+PL/SQL develepment的安装配置 之前一直想学Oracle,可是就是安装配置Oracle一直未成功,让人很苦恼,特别是什么监听器什么的 ...

  10. 转://oracle 11gR2 oracle restart 单机使用asm存储 主机名发生更改处理过程

    oracle 11gR2 oracle restart 单机使用asm存储 主机名发生更改并且主机重启后处理过程: 以下为解决方案: 1. Remove Oracle Restart configur ...

随机推荐

  1. C ++ 17 技术上已经完成,C ++ 20 也在路上(有路线图)

    在前不久结束的冬季 ISO C ++标准会议(Kona)上,C ++ 17 宣布在技术上已完成,仅剩下一些 ISO 相关的繁文缛节,即将提交至最终的 ISO 投票表决.该会议由 Plum Hall 和 ...

  2. WPF进阶教程 - 使用Decorator自定义带三角形的边框

    原文:WPF进阶教程 - 使用Decorator自定义带三角形的边框 写下来,备忘. Decorator,有装饰器.装饰品的意思,很容易让人联想到设计模式里面的装饰器模式.Decorator类负责包装 ...

  3. WPF异常捕获,并使程序不崩溃!

    原文:WPF异常捕获,并使程序不崩溃! 在.NET中,我们使用try-catch-finally来处理异常.但,当一个Exception抛出,抛出Exception的代码又没有被try包围时,程序就崩 ...

  4. 【推荐网站】下载国外网盘+强大的离线下载站—offcloud.com

    博主在网上浏览时看到一篇帖子,推荐了一个离线下载网站–offcloud.com,支持上传种子文件.磁力链和几十家网盘的直连下载,厉害了我的哥,这是个啥网站这么666.即使之前咱们写了几篇文章来自建下载 ...

  5. InstallUtil.exe版本引起安装windows services 服务遇到的问题,System.BadImageFormatException

    原文:把程序安装成windows服务的过程及遇到的问题 做好了定时任务的程序,要把它放在服务器上,作为windows服务运行,也就是说,退出登录,用户注销后程序任然在后台运行. 将exe程序发布为服务 ...

  6. WinForm DataGridView制作表格

    1.  将背景颜色改为白色 this.dataGridView1.BackgroundColor = Color.White; 或 2. 禁止启用添加,启用编辑,启用删除 this.dataGridV ...

  7. 【转载】动态载入DLL所需要的三个函数详解(LoadLibrary,GetProcAddress,FreeLibrary)

    原文地址:https://www.cnblogs.com/westsoft/p/5936092.html 动态载入 DLL 动态载入方式是指在编译之前并不知道将会调用哪些 DLL 函数, 完全是在运行 ...

  8. C#添加应用路径到系统PATH变量

    var dllDirectory = @"C:/some/path"; Environment.SetEnvironmentVariable("PATH", E ...

  9. Application.StartupPath和System.Environment.CurrentDirectory的区别

    System.Environment.CurrentDirectory的含义是获取或设置当前工作路径,而Application.StartupPath是获取程序启动路径,表面上看二者没什么区别,但实际 ...

  10. Android零基础入门第64节:揭开RecyclerView庐山真面目

    原文:Android零基础入门第64节:揭开RecyclerView庐山真面目 大家还记得之前在第38期~第50期都在学习列表控件吗,其中用了8期讲ListView的使用,相信都已经掌握好了吧.那么本 ...