精华内容
下载资源
问答
  • 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表的随机数据的时候,则会涉及到多个库的操作,在建立连接会消耗一定的时间,效率还是会有所降低的。但是整体效果还是不错的哦。该需求完成处理解决。

    。。
    。。
    。。

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

    展开全文
  • 最近做的几个项目,都碰到了ODIoracle9i或者10g数据库中抽取增量数据的情况,那么ODI如何从数据库中抽取增量数据呢,ODI针对Oracle数据库抽取,提供了3类知识模块: Oracle Simple Oracle Consistent ...

    最近做的几个项目,都碰到了ODI从oracle9i或者10g数据库中抽取增量数据的情况,那么ODI如何从数据库中抽取增量数据呢,ODI针对Oracle数据库的抽取,提供了3类知识模块:

    Oracle Simple

    Oracle Consistent

    Oracle 9i/10g/11gConsistent (LOGMINER)

    Simple方式一般是针对数据库中需要增量复制的表之间没有主外键约束的情况,在这种方式下,表之间的先后复制关系没有影响。但如果表之间有主外键对照关系,采用simple方式就会出现问题,举个简单的例子,我们需要从源数据库抽取两张表订单和订单明细表的增量数据,其中订单明细表的外键要参照订单表的主键。

    1.      我们将订单表中主键从11000-25000的增量数据复制到目标端。

    2.      在复制的过程中,源端订单表又插入了两条新数据,主键为25001和25002。

    3.      当进行订单明细表的增量数据复制时,与订单表中主键25001和25002对应的明细数据就会在目标端出错,因为刚才复制时,这两条数据没有复制到目标端。

    Consistent方式就是专门来解决这个问题的,它在处理父表前首先锁定(注意不是锁住)主表和子表需要复制的记录,在增量数据复制时,插入主表和子表的新增量数据都会被本次抽取过程忽略,放在下次抽取时处理。因此采用Consistent方式进行增量数据捕获一般需要5个步骤:

    1.      扩展窗口(extend_window):计算主表和子表本次抽取的结果集,并赋予其一个序列号。

    2.      锁定订阅者(lock subscriber):针对变化数据的某个订阅者,确定其需要抽取的序列号范围(一个系统的变化数据可能会被多个系统使用,比如主数据管理系统)。

    3.      执行抽取过程,我们通过ODI中的接口程序进行实现。

    4.      抽取完成后,解锁订阅者(unlock subscriber):记录下本次抽取的最后的序列号,以便于下次使用。

    5.      清除增量数据(Purge the journal):将已经复制完成的增量数据清楚(这里是指所有的订阅者)。

     

    在具体的实现方式上,Oracle Simple、Oracle Consistent是采用同步方式进行增量数据抽取的,说白了就是在源系统相关表上添加触发器,如下图所示:

     

     


    当源数据库中的交易需要修改相关表时,会调用触发器,将变化数据插入到增量表中,触发器的调用是包含在交易中的,这就决定了变化数据的实时性高,在需要实时变化的场景,非常适用,而且这种方式在数据库非归档状态下也照常运行,其缺点是由于触发器包含在对数据修改的事务中,当系统并发量比较大时,会对原有系统的效率产生一定影响。很多同事一听说触发器就觉得对源系统影响非常大,其实并不是这样。这里需要澄清的一点概念是触发器往变化数据表中写的并不是所有变化的数据,而可能只是一个主键或者再加一点额外的信息,其对系统的影响比我们想象的要小得多。

    Oracle 9i/10g/11gConsistent (LOGMINER)方式可以配置成异步方式,基于Oracle数据库的online redo log进行变化数据的捕捉(这里要特别提醒的是目前ODI只支持Hotlog方式),说的更白一点就是oracle stream技术,变化的数据通过logminer技术从在线日志中获取。如下图所示:

     


    这种方式基于异步的策略,一般变化数据的获取会有1秒到几分钟的数据延迟,当然对数据仓库系统来讲,这点时间也不算啥。但是由于其从日志中抽取变化数据,对原有的生产系统影响很小,而且该方式在用户原来的schema上除了一个读权限外,不需要额外的权限要求,因此大多数用户都愿意采用这种方式。但该方式需要对用户有一定的权限要求,而且数据库必须运行在归档模式下。具体的配置我们下次再说。

     

    展开全文
  • 最近做的几个项目,都碰到了ODIoracle9i或者10g数据库中抽取增量数据的情况,那么ODI如何从数据库中抽取增量数据呢,ODI针对Oracle数据库抽取,提供了3类知识模块:Oracle SimpleOracle ConsistentOracle 9i/10g...

    最近做的几个项目,都碰到了ODIoracle9i或者10g数据库中抽取增量数据的情况,那么ODI如何从数据库中抽取增量数据呢,ODI针对Oracle数据库的抽取,提供了3类知识模块:

    Oracle Simple

    Oracle Consistent

    Oracle 9i/10g/11gConsistent (LOGMINER)

    Simple方式一般是针对数据库中需要增量复制的表之间没有主外键约束的情况,在这种方式下,表之间的先后复制关系没有影响。但如果表之间有主外键对照关系,采用simple方式就会出现问题,举个简单的例子,我们需要从源数据库抽取两张表订单和订单明细表的增量数据,其中订单明细表的外键要参照订单表的主键。

    1.      我们将订单表中主键从11000-25000的增量数据复制到目标端。

    2.      在复制的过程中,源端订单表又插入了两条新数据,主键为2500125002

    3.      当进行订单明细表的增量数据复制时,与订单表中主键2500125002对应的明细数据就会在目标端出错,因为刚才复制时,这两条数据没有复制到目标端。

    Consistent方式就是专门来解决这个问题的,它在处理父表前首先锁定(注意不是锁住)主表和子表需要复制的记录,在增量数据复制时,插入主表和子表的新增量数据都会被本次抽取过程忽略,放在下次抽取时处理。因此采用Consistent方式进行增量数据捕获一般需要5个步骤:

    1.      扩展窗口(extend_window:计算主表和子表本次抽取的结果集,并赋予其一个序列号。

    2.      锁定订阅者(lock subscriber):针对变化数据的某个订阅者,确定其需要抽取的序列号范围(一个系统的变化数据可能会被多个系统使用,比如主数据管理系统)。

    3.      执行抽取过程,我们通过ODI中的接口程序进行实现。

    4.      抽取完成后,解锁订阅者(unlock subscriber):记录下本次抽取的最后的序列号,以便于下次使用。

    5.      清除增量数据(Purge the journal):将已经复制完成的增量数据清楚(这里是指所有的订阅者)。

     

    在具体的实现方式上,Oracle SimpleOracle Consistent是采用同步方式进行增量数据抽取的,说白了就是在源系统相关表上添加触发器,如下图所示:

     

    当源数据库中的交易需要修改相关表时,会调用触发器,将变化数据插入到增量表中,触发器的调用是包含在交易中的,这就决定了变化数据的实时性高,在需要实时变化的场景,非常适用,而且这种方式在数据库非归档状态下也照常运行,其缺点是由于触发器包含在对数据修改的事务中,当系统并发量比较大时,会对原有系统的效率产生一定影响。很多同事一听说触发器就觉得对源系统影响非常大,其实并不是这样。这里需要澄清的一点概念是触发器往变化数据表中写的并不是所有变化的数据,而可能只是一个主键或者再加一点额外的信息,其对系统的影响比我们想象的要小得多。

    Oracle 9i/10g/11gConsistent (LOGMINER)方式可以配置成异步方式,基于Oracle数据库的online redo log进行变化数据的捕捉(这里要特别提醒的是目前ODI只支持Hotlog方式),说的更白一点就是oracle stream技术,变化的数据通过logminer技术从在线日志中获取。如下图所示:

     

    这种方式基于异步的策略,一般变化数据的获取会有1秒到几分钟的数据延迟,当然对数据仓库系统来讲,这点时间也不算啥。但是由于其从日志中抽取变化数据,对原有的生产系统影响很小,而且该方式在用户原来的schema上除了一个读权限外,不需要额外的权限要求,因此大多数用户都愿意采用这种方式。但该方式需要对用户有一定的权限要求,而且数据库必须运行在归档模式下。具体的配置我们下次再说。

    展开全文
  • 数据库随机抽取数据

    2019-04-13 08:57:20
    order('rand() asc')

    order('rand() asc')

    展开全文
  • Sybase数据库抽取数据中文乱码

    千次阅读 2011-04-07 19:46:00
    现象:UDXSybase数据库抽取数据中文乱码。 <br /> 环境: <br /> .通信节点服务器OS:Windows XP <br /> .Sybase: Sybase ASE 12.5.1 <br /> .ODBC数据源:test173 <br /> ....
  • 从数据库中随机抽取10条记录 select * from (  select * from 表名 order by dbms_random.value ) where rownum     产生规定范围的随机数 select dbms_random.value(30,40) from dual
  • Pandas数据库数据抽取

    千次阅读 2018-05-21 11:46:44
    记录抽取:是指根据一定的条件,对数据进行抽取函数用法:dataframe[condition]import pandas; from pandas import read_csv; df = read_csv("E://pythonlearning//datacode//firstpart//4//4.8//data.csv&...
  • 这个是Mysql的字段 ![图片说明](https://img-ask.csdn.net/upload/201906/28/1561705850_478697.png) 。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。 这个是报错的问题。 ![图片说明]...
  • Kettle (2) - 抽取数据库表的数据

    千次阅读 2017-11-21 10:39:18
    数据库表是 ETL 数据抽取最常见的的数据源。我们以 MySQL 为例,了解 Kettle 从数据库中抽取数据的要点。
  • 需求如下:每天定时要多个数据库中抽取数据存到oracle数据库中,有的是sqlserver有的是mysql,用java写如何效率会高一些
  • 最简单的数据抽取就是把目标源中所需要的数据抽取到自己的数据库中。只要知道数据库的字段然后select、insert就OK了 2、可配置字段的数据抽取 (1)自定义配置文件 因为项目的需求,无法确定目标源中表...
  • 关于数据库随机抽取10条数据 Demo

    千次阅读 2018-11-23 15:08:47
    关于数据库随机抽取10条数据 Demo : select top 10 *,NEWID as a from table order by a --通过全球唯一标识符进行排序从而取道10条数据**加油**
  • laravel如何高性能地mysql数据库中随机获取n条数据,有时候我们常常会需要从数据库随机获取数据,比如:给工作人员随机分配10个订单,随机从数据库中随机抽查100个用户;这样我们就需要随机从数据库获取数据。 一...
  • kettle——(2)抽取数据同步数据库:https://blog.csdn.net/jack_yangying/article/details/78062969 Kettle学习一:简单的表输入输出 1.创建两个DB连接,test和test1,分别连接两个不同的数据库 2...
  • tablnd连接数据库抽取数据保存为csvORACLE数据库连接tOracleInput连接配置tMap设置模式一:所有字段抽取模式二:部分字段抽取模式三:增加额外字段保存为csv文件tFileOutputDelimited 设置 ORACLE数据库连接 使用...
  • 我们以MySQL数据库为例,讲述怎么实现多张表随机抽取数据组合成一张新的表。问题分解可以这样:我们简化难度,首先我们先实现随机一张表抽取一条数据,并把它存储在一个临时变量,我们可以重复以上工作,...
  • 另一个应用需要实时或接近实时地(如延时几秒)抽取数据库中的增量数据;但不能对数据库有性能影响(或则影响非常小,如下降千分之一以内),不能在数据库上做开发(如触发器存储过程之类),更不能修改数据库配置...
  • 根据用户配置的数据源动态的抽取或者查询该数据库的数据,应用场景还是比较多的,比如BI系统,动态配置多个数据源,无需重启,即可抽取数据 开题前 之前一直以为动态抽取数据是特别高深的技能点,总是望而却步,...
  • 数据抽取工具调研

    2019-10-13 18:50:05
    从数据库中抽取数据一般有以下几种方式。 (1)全量抽取 全量抽取类似于数据迁移或数据复制,它将数据源的表或视图的数据原封不动的从数据库中抽取出来,并转换成自己的ETL工具可以识别的格式。全量抽取比较简单。 ...
  • 从数据库中随机抽取一条记录

    千次阅读 2019-04-02 18:17:12
    My SQL: select * from a order by rand() limit 1 Oracle: select * from (select * from table-name order by dbms_random.value) where rownum <... select top N * from tableName o...
  • 从数据库中随机抽取记录

    千次阅读 2008-07-30 18:32:00
    Access语法:SELECT top 10 * From 表名 ORDER BY Rnd(id)Sql server语法:select top n * from 表名 order by newid()MySql语法:Select * From 表名 Order By rand() Limit n
  • 如需抽取并生成十份数据文档,每份数据文档需抽取数据十条 我的做法是这样的,首先获得将要进行抽取的数据的总量,以数据的总量为基值去产生随机数,此时的随机数相当于数据库中数据的行号,以此行号结果集中...
  • 用java的线程控制程序一个数据库中定时自动抽取数据到另一个数据库,实现数据库的同步。代码很详细。
  • Randomize sql="select top 5 * from 表名 ORDER BY Rnd(-(ID+"&amp;Rnd()&amp;"))"  
  • SAP中抽取数据

    千次阅读 2016-08-09 15:11:58
    1.我(对SAP完全不了解)需要SAP中抽取数据(如应收账款、应付账款、生产成本、存货等等)到公司的数据仓库做数据分析,看了一些文档和请教别人,目前知道三种方式实现方式:1.RFC;2.BAPI;3.IDOC;很多人推荐...
  • 多线程抽取数据库数据数据迁移

    千次阅读 2018-10-19 09:11:07
    2000万数据同步,每次查询20000分页,一分钟分钟之内全部塞入到队列里等待 log.info("房屋数仓数据同步调度开始!"); Date yesterday = null; HouseFeedbackCount hfb = getHouseFeedbackCountTime...
  • 在不同机器,不同数据库之间抽取数据 转换实现步骤: 拉取表输入和表输出,两者联系起来(快捷键Shift+鼠标) 表输入的是抽取数据的源表 表输出的是取得数据目标表 连接数据库 输入完相关信息,可以...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 98,883
精华内容 39,553
关键字:

从数据库中抽取数据