SQL SERVER下生成随机数据干得多,可是到了Oracle下我就傻了。没用过Oracle,不知道该怎么办?SQL SERVER下依靠TABLESAMPLE或者CHECKSUM(NEWID())来做随机抽样,Oracle则有它自己的随机抽样方法。

这里找到一篇文章讲得挺好的:http://www.cnblogs.com/Athrun/archive/2009/04/25/1443619.html

Oracle下随机取样相关的办法有:

1)SAMPLE(percent)

2)SAMPLE BLOCK(percent)

3)dbms_random包,包括dbms_random.random,dbms_random.value

4)sys_guid()

差不多就是上面这几种吧

那其实我觉得各有各的特点,如果单论性能那肯定SAMPLE的性能最好了,Oracle的采样技术减少了过程需要扫描的BLOCK数量,而SAMPLE BLOCK(percent)和SAMPLE(percent)比谁性能要更好就不清楚了,不晓得Oracle扫描的时候是一个BLOCK取一行还是把整个BLOCK的行都取出来。我想SAMPLE BLOCK的性能应该是要比SAMPLE的性能要更好。不过离散分布率要更低。

其实和SQL SERVER下的TABLESAMPLE一样,用SAMPLE的问题在于离散率。如果我们对某个取样数据的离散率要求很高,那显然dbms_random和sys_guid()应该比SAMPLE要做得更好。

这里对比一下SAMPLE, dbms_random.random和dbms_random.value的差异

  1. select * from NUMBERS SAMPLE(0.1) order by ID ASC;
  2.  
  3. select * from (
  4. select * from NUMBERS
  5. order by dbms_random.random )
  6. where rownum <= 100
  7. order by ID ASC;
  8.  
  9. select * from (
  10. select * from NUMBERS
  11. order by dbms_random.value )
  12. where rownum <= 100
  13. order by ID ASC;

SAMPLE的结果输出了112行,表的行数是10万行,percent为0.1,按道理应该输出100行整。证明SAMPLE对于行数还是不确定。这里还得再离散提取前100行出来。不过我相信它的性能应该是最好的,耗时上也证明了这一点。而且和后面两个对比数据分布的离散化也是差不多,我之前担忧的会出现同一个BLOCK下的行多数或者都被提出来的情况似乎是多余,这里的数据分布和其他两者相近。至于说其他两者的性能似乎相差无几,基本一样。不过这里有篇博文好像说random比value性能要好,http://www.blogjava.net/pengpenglin/archive/2009/03/19/206796.html

dbms_random.random的结果

dbms_random.value的结果

有几点要注意的是

1) SAMPLE只对单表有效,远程表和连接查询无效

2)SAMPLE会使SQL自动使用CBO

这里摘取别人文章中关于sys.guid()函数的注释

注:
        在使1)方法时,即使用sys_guid() 这种方法时,有时会获取到相同的记录,即和前一次查询的结果集是一样的,我查找了相关资料,有些说是和操作系统有关,在windows平台下正常,获取到的数据是随机的,而在linux等平台下始终是相同不变的数据集,有些说是因为sys_guid()函数本身的问题,即sys_guid()会在查询上生成一个16字节的全局唯一标识符,这个标识符在绝大部分平台上由一个宿主标识符和进程或进程的线程标识符组成,这就是说,它很可能是随机的,但是并不表示一定是百分之百的这样.

在Oracle中一般获取随机数的方法是:

select trunc(dbms_random.value(0, 1000)) from dual; (0-1000的整数)
select dbms_random.value(0, 1000) from dual; (0-1000的浮点数)

Oracle ->> 随机函数的更多相关文章

  1. Oracle dbms_random随机函数包

    dbms_random是oracle提供的一个随机函数包,以下是它的一些常用的功能: 1.dbms_random.value 作用:生成一个大于等于0,大于等于1的随机的38位小数,代码如下: sel ...

  2. 深入理解Oracle中的随机函数

    --Oracle中取随机值的函数 .dbms_random包 dbms_random包提供了一系列的随机值获取函数以及相关存储过程.下面详细讲解常用的函数和过程. ()dbms_random.rand ...

  3. Oracle 关于几个随机函数sys_guid、dbms_random.random、dbms_random.value(取随机的结果集)

    sys_guid():SYS_GUID (),是Oracle 8i 后提供的函数.SYS_GUID产生并返回一个全球唯一的标识符(原始值)由16个字节组成.更适合多个数据库数据集成时使用(--源自百度 ...

  4. 常用Oracle SQL语句(汇总版)

    Oracle数据库常用sql语句 ORACLE 常用的SQL语法和数据对象 一.数据控制语句 (DML) 部分 1.INSERT (往数据表里插入记录的语句) INSERT INTO 表名(字段名1, ...

  5. oracle常用SQL语句(汇总版)

    Oracle数据库常用sql语句 ORACLE 常用的SQL语法和数据对象一.数据控制语句 (DML) 部分 1.INSERT (往数据表里插入记录的语句) INSERT INTO 表名(字段名1, ...

  6. oracle 语句汇总

    Oracle数据库常用sql语句 ORACLE 常用的SQL语法和数据对象 一.数据控制语句 (DML) 部分 1.INSERT  (往数据表里插入记录的语句) INSERT INTO 表名(字段名1 ...

  7. Oracle中查询各种对象的方法小结

    --查看当前库中的所有表select * from all_tables a where a.table_name='INFOCODE_P20081'--查看表结构select * from all_ ...

  8. ORACLE数据库 DBA常用知识

    <常用命令参考> 个系统变量值 SQL> show user --显示当前连接用户 SQL> show error --显示错误 SQL> set heading off ...

  9. Oracle常用语句

    Oracle数据库常用sql语句 ORACLE 常用的SQL语法和数据对象一.数据控制语句 (DML) 部分 1.INSERT (往数据表里插入记录的语句) INSERT INTO 表名(字段名1, ...

随机推荐

  1. CoffeeRobotTeam项目组报告

    一.小组分工 模块 任务 责任人 备注 报告 需求分析 熊振威 功能分析 熊振威 项目报告 熊振威 人机界面 秦勤.洪超 单元测试 姜进.张文强 机器人代码 机器人类 徐意.余拥军.孙智博 机器人运动 ...

  2. Java面试之SE基础基本数据类型

    1.九种基本数据类型的大小以及它们的封装类 在我们面试或者考试过程中经常会考到八种基本数据类型以及它们的封装类,那么有哪八种基本数据类型呢?它们的封装类又是什么呢? 首先,八种基本数据类型分别是:in ...

  3. iptables端口转发

    iptables -t nat -A PREROUTING -d {外网ip}/32 -p tcp -m tcp --dport 4956 -j DNAT --to-destination 10.1. ...

  4. 制作C/C++动态链接库(dll)若干注意事项

    一.C\C++ 运行时库编译选项简单说明 问题:我的dll别人没法用 运行时库是个很复杂的东西,作为开发过程中dll制作需要了解的一部分,这里主要简单介绍一下如何选择编译选项. 在我们的开发过程中时常 ...

  5. 一些 Shell 脚本(持续更新)

    1. 启动日志分析 启动日志格式如下: 开机时间:2015/05/13 周三 16:45:17.79 关机时间:2015/05/13 周三 18:46:03.91 开机时间:2015/05/14 周四 ...

  6. 安装Netsharp演示插件

    阅读本文请先阅读Netsharp下载及环境搭建 Netsharp提供了DEMO程序,DEMO完成的功能是Netsharp文章系列中的Netsharp快速入门系列中介绍的功能,DEMO是以Netshar ...

  7. BZOJ 2653 middle

    AC通道:http://www.lydsy.com/JudgeOnline/problem.php?id=2653 题目大意:多组询问,求左右端点在规定范围内移动所能得到的最大中位数. [分析] 求中 ...

  8. jdbc读取数据库表

    把结果集封装为List // 通过结果集元数据封装List结果集 public static List<Map<String, Object>> read(String sql ...

  9. JS中函数的基础知识

    函数 一.  函数定义 函数又叫方法,在程序里面函数是用来执行某些特定功能的代码.为了减少重复使用代码,可以把特定功能的代码做成函数,需要使用时拿出来调用.alert();就是一个很常见的.简单的函数 ...

  10. Sqli-labs less 23

    第二部分/page-2 Advanced injection Less-23 Sql语句为$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1 ...