-
2021-01-19 02:33:33
最近调查了一下从数据库中增量抽取数据的几种方案。下面是一个比较粗的结论。
方法1:基于时间戳
以某个时间字段为条件,检出新增数据。
适用条件:表中有时间字段,并且是事件型的数据,不需要反映数据的删除和更新。
对性能的影响:抽取时增加系统负载
方法2:触发器
数据更新时通过触发器拷贝数据。
适用条件:预先定义触发器
对性能的影响:对更新操作的性能有一定影响
方法3:从redo日志抽取
Oracle可以通过LogMiner从日志中分析出SQL语句,再还原。SQL Server也有类似解决方法。
适用条件:系统运行于归档模式下,并做好相关配置
对性能的影响:总体上对性能的比较小,但部署比较复杂
方法4:全表对比
对性能的影响:比较大,不适用数据量很大的情况
对方法1和方法4可采用以下对策减小性能影响:
1)按时间对数据分区
2)通过备份恢复,在线日志恢复等手段建立备机,在备机上抽取数据。
总结:
在性能影响可以接受的情况下,建议采用方法1或2,比较简单。否则采用方法3。
另外,也可以使用专用抽取工具,如SSIS,ODI等。
专用工具也是基于前几种方法实现的,比如ODI提供基于触发器和基于redo日志抽取方案。
但专用工具比起自己开发,能更快部署。
更多相关内容 -
JAVA将一个数据中数据定时自动复制(抽取)到另一个数据库
2020-09-18 11:30:14用java中的线程控制程序从一个数据库中定时自动抽取数据到另一个数据库,实现数据库的同步。代码很详细。 用java中的线程控制程序从一个数据库中定时自动抽取数据到另一个数据库,实现数据库的同步。代码很详细。 -
一种关系数据库数据抽取模型研究
2021-01-26 23:36:52针对关系数据库数据抽取过程中问题经常发生复制中断问题,采用数据库在线Redo日志增量数据快速定位于解析技术,设计一种Redo日志数据抽取模型,给出了INSERT、DELETE、UPDATE 3种DML操作日志数据捕获方法。... -
抽取oracle数据到mysql数据库的实现过程
2020-09-09 05:14:46今天小编就为大家分享一篇关于抽取oracle数据到mysql数据库的实现过程,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧 -
mysql-从数据库中随机抽取数据的分析总结
2020-07-15 18:08:51mysql-从数据库中随机抽取数据的分析总结 本文章只针对从mysql随机抽取数据进行方法分析,和总结 项目需要通过表名获取随机数据进行数据校验工作,所以有这个随机从数据库拉数据的需求; 通过查询资料和网友们的博客...本文章只针对从mysql随机抽取数据进行方法分析,和总结
项目需要通过表名获取随机数据进行数据校验工作,所以有这个随机从数据库拉数据的需求;
通过查询资料和网友们的博客等都未能很好解决需求问题,接下来针对网上的方法进行分析和总结,并给出自己最优的解决方案;直接进入主题:
mysql随机抽取数据方法汇总
1.第一种:
select * from `table` order by rand() limit 1;
分析:该种抽取数据的方法,可以达到效果,但是运行效率非常低,在百万级别下运行时间超长,无法满足需求。
2.第二种:
SELECT * FROM `table` AS t1 JOIN (SELECT ROUND(RAND() * ( (SELECT MAX(id) FROM `table`)-(SELECT MIN(id) FROM `table`))+(SELECT MIN(id) FROM `table`)) AS id) AS t2 WHERE t1.id >= t2.id ORDER BY t1.id LIMIT 1;
分析:该种方法相比第一种效率非常高,基本在0.几秒内能查询获取到的数据
优点:速度非常快,在千万级数据下,随机查询获取一条数据的时间为0.161s;
缺点:无法一次性获取多条,当把limit改写成10000之后,获取到的数据是连续的,无法满足需要的随机性。3.第三种:
SELECT * FROM `table` WHERE id >= (ROUND(((( SELECT MAX( id ) FROM `table`)-( SELECT MIN( id ) FROM `table`)) * RAND()),0) + ( SELECT MIN( id ) FROM `table`)) LIMIT 1;
分析:该种方法相比于第一种方法效率非常高,跟第二种方法执行效率差不多;能基本满足随机性要求,但是当将limit 改成100或者10000的时候,数据出现连续一段范围内的随机数,而不是全量数据里面的随机。
优点:速度非常快,在千万级数据下,随机查询一条的时间为0.116s,能获取随机性多条数据;另外当数据的ID不连续之后,通过该方法能一次性获取200;数据库会自动排除不存在的ID;
缺点:在数据量达千万级别时,limit变成10000之后,数据还是随机的,但是会相对性的限制在一定范围内,当limit改成200之后,ID随机性保存在1-100000之间的随机性,达不到需求的全量随机性;导致该问题的原因在rand()函数;但是当我将最多id和最小id取出来自己做了操作之后,查询效率变慢了 ;4.第四种:
采用程序生成随机ID,并查询获取的方式
具体方法:
①:通过表名获取最大ID和最小ID值
②:生成随机数方法:public class NumberUtil { public static void main(String[] args) { //0-10之内,随机取五个数 List<Integer> integers = randomCommon(1, 1496255, 200); if (integers != null && integers.size() != 0) { for (int i : integers) { System.out.println(i + ","); } } else { System.out.println("kk"); } } /** * 随机指定范围内N个不重复的数 * * @param min 指定范围最小值 * @param max 指定范围最大值 * @param n 随机数个数 * @return */ public static List<Integer> randomCommon(int min, int max, int n) { List<Integer> integers = new ArrayList<Integer>(); if (min < 0) { min = 0; } if ((max - min) + 1 < n) { n = (max - min) + 1; } if (max < min) { max = min; } if (max < 0 || n < 0) { return integers; } for (int i = 1; i <= n; i++) { int randomNumber = (int) Math.round(Math.random() * (max - min) + min); if (integers.contains(randomNumber)) { i--; continue; } else { integers.add(randomNumber); } } return integers; } }
③:通过获取到的ID,进行数据查询,在该方法内为了避免数据ID不连续问题,当中有两种方法可选:
第一种:通过上述第三种方法进行数据获取;
第二种:通过扩大随机范围获取数据,在从获取到的数据,在通过中位数从中间往两端获取数据达到随机数据的需去,部分代码如下:
通过以上步骤满足项目需求,如果只对一张table进行数据随机获取,该方法效率还算可观;
当需要对N张table进行数据获取操作,则可以通过stream.parallelStream并发进行获取数据,有兴趣的可以自行进行查找资料学习一下,在要获取N张table表的随机数据的时候,则会涉及到多个库的操作,在建立连接会消耗一定的时间,效率还是会有所降低的。但是整体效果还是不错的哦。该需求完成处理解决。。。
。。
。。有不同见解的同学,也可以进行反馈;
-
ODI如何通过logminer技术从oracle_数据库中抽取增量数据
2012-02-24 08:51:16ODI如何通过logminer技术从oracle_数据库中抽取增量数据 -
数据库工具-数据量抽取&数据库阻塞探测
2018-09-15 11:27:45数据库工具-数据量抽取&数据库阻塞探测 -
【JDBC实战经验】从数据库中随机取出数据的2种方法
2021-02-28 14:55:38*注:conn 表示获取到的数据库连接对象 首先获取数据总条数 private static int getDataNum(Connection conn, String tableName) throws SQLException { PreparedStatement ps = conn.prepareStatement("select ...*注:conn 表示获取到的数据库连接对象
首先获取数据总条数
private static int getDataNum(Connection conn, String tableName) throws SQLException { PreparedStatement ps = conn.prepareStatement("select count(*) from "+tableName); ResultSet getNum = ps.executeQuery(); if(getNum.next()) return getNum.getInt(1); else return -1; }
通过 count 计算出总的数据条数
方法一:借助 limit
// 随机获取数据法一 public String getRanData(Connection conn) throws SQLException { PreparedStatement ps = conn.prepareStatement("select <dataName> from <tableName> limit ?, 1"); int dataNum = getDataNum(conn, <dataName>); int rand = (int)(Math.random() * dataNum); ps.setInt(1, rand); ResultSet data = ps.executeQuery(); if(data.next()) return data.getString(1); else return null; }
这种方法只需要预编译一次,以后配合随机数通过
settInt
修改占位符 ? 的值,即可重复从数据库中随机取出数据limit ?, 1 中的 1 表示取出 1 条数据
可以修改为更大的值 n 表示取出从该位置开始的 n 条数据,不过需要另加判断防止越界以及 while 循环读取数据
方法二:转化成 ArrayList 通过下标读取
// 随机读取数据法二 public String getRanData(Connection conn) throws SQLException { Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("select * from <tableName>"); ArrayList<String> data = new ArrayList<>(); int dataNum = getDataNum(conn, <tableName>); int rand = (int)(Math.random() * dataNum); while(rs.next()) data.add(rs.getString(<dataName>)); return data.get(rand); }
30 min Get (寒冰小澈)
-
Sqoop查询与抽取Teradata数据库中的数据
2022-03-05 11:23:45查看oracle数据库中有哪些表 sqoop list-tables --connect jdbc:oracle:thin:@20.10.1.21:1521/ccb \ --username wws\ --password w0210 \ 查看teradata数据库中有哪些表 sqoop list-tables --connect jdbc:...Teradata数据库
1.使用sqoop查看数据库中有哪些表
查看oracle数据库中有哪些表 sqoop list-tables --connect jdbc:oracle:thin:@20.10.1.21:1521/ccb \ --username wws\ --password w0210 \ 查看teradata数据库中有哪些表 sqoop list-tables --connect jdbc:teradata://20.10.11.48/CLIENT_CHARSET=EUC_CN,TMODE=TERA,CHARSET=ASCII,LOB_SUPPORT=off,DATABASE=SDATA --username dbc --password d399
2.创建临时表
drop table Ss2.ld_cust_mm; create table Ss2.ld_cust_mm (custr_nbr string ,surname string) row format delimited fields terminated by ',';
3.sqoop抽取数据到临时表
下面四个参数需要配置生产数仓的值
–IP:20.1000.11.41
–DATABASE:SDATA --连接的数据库
–username DEV_WCJ --用户名
–password DEV_WCJ --密码sqoop import --connect jdbc:teradata://20.10.17.42/CLIENT_CHARSET=GB18030,TMODE=TERA,CHARSET=ASCII,LOB_SUPPORT=off,DATABASE=SDATA \ --username DEV_WCJ \ --password DEV_WCJ \ --query 'select custr_nbr,surname from SDATA.ld_cust_mm where $CONDITIONS' \ --delete-target-dir \ --target-dir /user/hive/warehouse/s02.ld_cust_mm/bd_custr_hs_mapping --verbose --num-mappers 1 \ --hive-drop-import-delims --null-string '\\N' --null-non-string '\\N' \ --driver com.teradata.jdbc.TeraDriver
-
Scala连接Mysql数据库和Sqlserver数据库,增量抽取数据存储到Hive数据库
2020-12-17 15:29:55这里采用Scala开发Spark程序,按照索引ID增量抽取数据插入到hive数据库中,每次增量抽取300万条数据。 如下图所示: 每次抽取300万条数据,并且每次存储最大ID到一张记录表中,在最大ID基础上实现每次增量抽取300万条... -
基于Matlab数据库工具箱的实验数据自动抽取及应用.pdf
2021-06-29 14:41:58基于Matlab数据库工具箱的实验数据自动抽取及应用.pdf -
使用sqoop抽取mysql数据
2018-10-26 22:00:41使用sqoop从传统数据库mysql中抽取数据到大数据集群。 -
JAVA语句实现提取数据库中的数据
2021-02-26 12:47:24展开全部//建立数据库连接类import java.sql.Connection;import java.sql.DriverManager;import java.sql.SQLException;public class Utilities {public static Connection getConnection() {Connection con = null;... -
一种通用的多数据库间数据抽取方法及应用.docx
2022-06-07 14:03:11一种通用的多数据库间数据抽取方法及应用 -
Kettle实战 ── 不同mysql数据库之间的数据抽取
2020-10-14 18:23:17在不同机器,不同数据库之间抽取数据 转换实现步骤: 拉取表输入和表输出,两者联系起来(快捷键Shift+鼠标) 表输入的是抽取数据的源表 表输出的是取得数据目标表 连接数据库 输入完相关信息,可以... -
一种通用的多数据库间数据抽取方法及应用 (2008年)
2021-05-27 02:04:13为方便从多个异构的数据源中抽取转换数据、并加载到目标数据库,提出一种...开发的抽取工具软件DbBridge,支持从Oracle,SQL server,SAS,Access,Excel等数据源抽取数据。软件成功应用于某数据仓库的建立及数据迁移 -
SQL Server数据库中多媒体信息的抽取与转换.pdf
2021-09-19 13:14:58SQL Server数据库中多媒体信息的抽取与转换.pdf -
Kettle实现增量抽取数据
2019-01-28 19:14:18Kettle实现Oracle两表之间进行增量抽取数据,不需要时间戳! -
kettle —— 从一个数据库抽取数据到另一个数据库
2019-04-11 10:30:15kettle——(2)抽取数据同步数据库:https://blog.csdn.net/jack_yangying/article/details/78062969 Kettle学习一:简单的表输入输出 1.创建两个DB连接,test和test1,分别连接两个不同的数据库 2... -
flume抽取数据库数据的source
2018-01-26 14:16:01flume抽取数据库数据的源码,可以自动检测数据库的sql语句是否更新 -
kettle数据抽取流程总结.docx
2021-08-12 15:00:21kettle数据抽取流程整理 -
如何自动地分列从数据库中提取数据?
2018-06-03 12:34:43(原创作者:陈玓玏)方法有两个,如下:一、 数据库(Oracle)中写入for循环 DECLARE a number(30) := 0; BEGIN for i in 1 .. 10 loop --INSERT INTO FW_TEST(NAME) VALUES('bbb' + i); sys.... -
数据库连接正常,但是无法从数据库中读取数据
2019-12-12 22:41:55数据库连接正常,但是无法从数据库中读取数据 在给别人写个java小课程设计碰到的一个问题,在我这里运行的好好的,到他那就出现:当数据连接正常,但是sql语句访问数据的时候,却读不出数据。 这个是我半路接下来的... -
kettle 从oracle数据库导数据到hive 表
2018-03-23 11:54:29由于公司要把oracle 数据库迁移到hive ,hbase 环境,特建议使用kettle做数据迁移,调试3个小时,终于调试成功,顺手写了个配置文档。 -
JAVA从数据库中拿到数据
2016-12-07 15:33:53我们都知道从数据库中拿到数据需要使用的是jdbc链接数据,然后将数据存储到ResultSet这样的集合中,然后利用Resultset的方法getObject获取里面的记录并且打印到页面上,当然我们可以将数据存在map中或者是list中,... -
如何从数据库中随机抽取10道题或20道题?
2018-11-30 01:35:44如何从数据库中随机抽取10道题或20道题?题库将在微信公众号上使用,完成测试。 -
数据平台的4个阶段:从数据库到数仓再到中台,超详细的架构全解
2020-07-15 17:08:19数据中台就是以云计算为数据智能提供的基础计算力为前提,与大数据平台提供的数据资产能力与技术能力相互结合,形成数据处理的能力框架赋能业务,为企业做到数字化、智能化运营。 目前,外界与业内很多人对于数据中... -
oracle数据库批量数据无损迁移技术研究
2021-01-12 18:25:13利用触发器捕捉oracle数据库批量数据的变化,通过设计数据库表代替触发器捕捉的sql语句,对数据同步中产生的数据变化信息进行存储,实现oracle数据库的数据同步,将同步后的数据转换为文档形式以对其进行传输,以元...