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的差异

select * from NUMBERS SAMPLE(0.1) order by ID ASC;

select * from (
select * from NUMBERS
order by dbms_random.random )
where rownum <= 100
order by ID ASC; select * from (
select * from NUMBERS
order by dbms_random.value )
where rownum <= 100
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. 深入理解CSS3 animation的steps

    在应用 CSS3 渐变/动画时,有个控制时间的属性 <timing-function> .它的取值中除了常用到的三次贝塞尔曲线以外,还有个让人比较困惑的 steps() 函数. steps ...

  2. 【Valid Palindrome】cpp

    题目: Given a string, determine if it is a palindrome, considering only alphanumeric characters and ig ...

  3. 使用第三方工具覆写Object中方法

    我们在实际开发中,经常需要覆写Object中的equals,hashcode,toString方法,其实编写这些代码并不是很难,但很枯燥和乏味. 下面推荐Google的Guava jar包来覆写上面的 ...

  4. PHP中如何连接数据库基本语句

    只是后端修改页面,不需要在前端显示的可以删除原有代码只输入<?php 开始编写语言即可,后面的?>也可以省略 //造一个连接$connect = @mysql_connect(" ...

  5. HDU 3555 Bomb 数位dp

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3555 Bomb Time Limit: 2000/1000 MS (Java/Others) Mem ...

  6. MyEclipse 关闭拼写检查、JavaScript的检查Build、xml、JSP的Bulid检查

    前言 MyEclipse 的拼写检查.JavaScript的检查Build.xml.JSP的Bulid检查很讨厌,有时不仅会一直build卡住,而且明明是对的它却报错,示例: 关闭方法 1.关闭拼写检 ...

  7. 【BZOJ】【2765】【JLOI2010】铁人双项比赛

    计算几何/半平面交 本来我是想去写POJ 1755的,然后想起了这道跟它很像的题,但应该是弱化版,所以就先写了这个…… 我们可以发现每个人的总用时,与k是呈一次函数关系的:$time_i=\frac{ ...

  8. JDBC数据库连接池原理

    JDBC是java数据库连接的简称.它是一种用于实行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用java语言编写的类和接口组成.其相关的API都在java.sql.*包下 ...

  9. Confluence Wiki Markup & Markdown

    Markup : 默认有支持 Markdown : 需先安装插件,插件下载地址: Confluence markdown : https://marketplace.atlassian.com/plu ...

  10. UNITY_MATRIX_IT_MV[Matrix] (转载)

    转载 http://blog.csdn.net/cubesky/article/details/38682975 前面发了一篇关于unity Matrix的文章. http://blog.csdn.n ...