精华内容
下载资源
问答
  • 从数据库中抽取数据
    千次阅读
    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的线程控制程序一个数据库中定时自动抽取数据到另一个数据库,实现数据库的同步。代码很详细。 用java的线程控制程序一个数据库中定时自动抽取数据到另一个数据库,实现数据库的同步。代码很详细。
  • 今天小编就为大家分享一篇关于抽取oracle数据到mysql数据库的实现过程,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
  • 针对关系数据库数据抽取过程问题经常发生复制中断问题,采用数据库在线Redo日志增量数据快速定位于解析技术,设计一种Redo日志数据抽取模型,给出了INSERT、DELETE、UPDATE 3种DML操作日志数据捕获方法。...
  • mysql-从数据库中随机抽取数据的分析总结 本文章只针对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表的随机数据的时候,则会涉及到多个库的操作,在建立连接会消耗一定的时间,效率还是会有所降低的。但是整体效果还是不错的哦。该需求完成处理解决。

    。。
    。。
    。。

    有不同见解的同学,也可以进行反馈;

    展开全文
  • Access数据库随机抽取记录条数.zip
  • ODI如何通过logminer技术oracle_数据库中抽取增量数据
  • 数据库工具-数据抽取&数据库阻塞探测
  • *注: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 (寒冰小澈)

    展开全文
  • 这里采用Scala开发Spark程序,按照索引ID增量抽取数据插入到hive数据库中,每次增量抽取300万条数据。 如下图所示: 每次抽取300万条数据,并且每次存储最大ID到一张记录表,在最大ID基础上实现每次增量抽取300万条...

    Scala连接Mysql数据库和Sqlserver数据库


    Mysql和Sqlserver源数据库单表数据量超过200G,现在需要把数据搬运到HDFS上存储,释放源数据库存储空间。这里采用Scala开发Spark程序,按照索引ID增量抽取数据插入到hive数据库中,计划每次增量抽取300万条数据,并且每次存储最大ID到一张记录表中。下次抽取的时候首先获取记录表中的最大ID作为数据抽取的起始ID,起始ID加300万与源数据库表中的最大ID进行比较,如果小于源数据库表中最大ID,则起始ID加300万的值作为数据抽取结束ID,如果大于源数据库表中最大ID,则取源数据库表中最大ID为数据抽取结束ID。

    如下图所示:
    每次抽取300万条数据,并且每次存储最大ID到一张记录表中,在最大ID基础上实现每次增量抽取300万条数据到Hive数据库表中。
    在这里插入图片描述

    下面详细记录了Scala连接Mysql数据库和Sqlserver数据库,增量抽取数据存储到Hive数据库的代码。连接Mysql数据库采取了单线程抽取数据,连接Sql

    展开全文
  • 查看oracle数据库中有哪些表 sqoop list-tables --connect jdbc:oracle:thin:@20.10.1.21:1521/ccb \ --username wws\ --password w0210 \ 查看teradata数据库中有哪些表 sqoop list-tables --connect jdbc:...
  • 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;...
  • 在不同机器,不同数据库之间抽取数据 转换实现步骤: 拉取表输入和表输出,两者联系起来(快捷键Shift+鼠标) 表输入的是抽取数据的源表 表输出的是取得数据目标表 连接数据库 输入完相关信息,可以...
  • 使用sqoop抽取mysql数据

    2018-10-26 22:00:41
    使用sqoop传统数据库mysql中抽取数据到大数据集群。
  • kettle的四个组成 spoon 图像化界面 pan 调用Trans kitchen 调用Job carte 一个web容器,建立专用 远程的ETL Server 安装完成后首先连接资源库 明天再写 从数据库提取数据 ...从数据中查询表 成功 ...
  • 通过kettle循环抽取整库数据至CSV文件,可根据该程序修改抽取数据数据库等。
  • kettle——(2)抽取数据同步数据库:https://blog.csdn.net/jack_yangying/article/details/78062969 Kettle学习一:简单的表输入输出 1.创建两个DB连接,test和test1,分别连接两个不同的数据库 2...
  • 一种通用的多数据库数据抽取方法及应用
  • 从数据库表 “图片存储”读取ID为1的图片数据并生成图片文件。   MySqlConnection conn = new MySqlConnection("Server=localhost;Database=test;charset=utf8;Uid=root;Pwd=123456"); conn.Open...
  • 基于Matlab数据库工具箱的实验数据自动抽取及应用.pdf
  • COCO_forYOLO COCO数据库中提取适合YOLO暗网的训练数据
  • Kettle实现Oracle两表之间进行增量抽取数据,不需要时间戳!
  • 为方便多个异构的数据源抽取转换数据、并加载到目标数据库,提出一种...开发的抽取工具软件DbBridge,支持Oracle,SQL server,SAS,Access,Excel等数据源抽取数据。软件成功应用于某数据仓库的建立及数据迁移
  • SQL Server数据库中多媒体信息的抽取与转换.pdf
  • (原创作者:陈玓玏)方法有两个,如下:一、 数据库(Oracle)写入for循环 DECLARE a number(30) := 0; BEGIN for i in 1 .. 10 loop --INSERT INTO FW_TEST(NAME) VALUES('bbb' + i); sys....
  • 介绍 需求背景: 快速同步不同数据库的指定表的数据。 能自动同步表结构 支持增量或全量同步数据 支持指定双向同步 ...数据库的信息写在配置文件,支持各种主流关系型数据库,例如MysqL,Db2,Or
  • 数据库连接正常,但是无法从数据库中读取数据 在给别人写个java小课程设计碰到的一个问题,在我这里运行的好好的,到他那就出现:当数据连接正常,但是sql语句访问数据的时候,却读不出数据。 这个是我半路接下来的...
  • flume抽取数据库数据的源码,可以自动检测数据库的sql语句是否更新

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 120,352
精华内容 48,140
关键字:

从数据库中抽取数据