`
zhenping
  • 浏览: 83203 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

Oracle随机抽取N条记录

 
阅读更多
ORACLE SAMPLE 语法应用说明

这两天发了一个贴子,寻找比较好的办法随机取出表的一条记录
地址见:http://www.oracle.com.cn/viewthread.php?tid=130433&extra=page%3D1
里面讨论了一些方法,其中版主valenwon加一个ROWNUM的字段并加索引是一种相对比较有效的方法,只是要改表结构,在测试库中可以,在生产库中就不行了,本文介绍了一下ORACLE SAMPLE语法的应用,采用SAMPLE也是一种解决方法,不过还不是很好,主要是返回的记录分布不均匀,要么是靠表前面的一些,要么是不返回记录。
下面是SAMPLE语法的使用示例:
选择10%的记录
select * from t1 sample(10)
选择0.1%的记录
select * from t1 sample(0.1)
根据数据块选择1%的记录
select * from t1 sample block(1)
使用数据块选择与使用记录行选择的区别:使用数据块选择表示样本的采集是基于数据块采集的,也就是说样本如果一个数据块被采集为样本,则数据块里的记录全部都是样本

样本统计是基于统计学采集的,是有概率问题,不一定完全准确,如你要取50%的记录,但实际可能返回给你49%的记录集,也可能返回给你51%的记录集

例如
如果表T1有数据块B1,B2
B1有记录R1,R2,R3,R4,R5
B2有记录R6,R7,R8,R9,R10
如果使用如下SQL选择50%的数据
select * from t1 sample block(50)
则返回的结果可能是数据块B1的记录
R1,R2,R3,R4,R5
也可能是数据块B2的记录
R6,R7,R8,R9,R10
也可能不返回记录集

如果使用如下SQL选择50%的数据
select * from t1 sample (50)
则返回的结果可能是
R2,R3,R5,R8,R9
也可能是如下的样子
R1,R3,R4,R8

应用示例:
随机从表中取中1条记录,选取记录的概率是1%
select * from t1 sample(1) where rownum=1
随机从表中取中10条记录,选取记录的概率是0.1%
select * from t1 sample(0.1) where rownum<=10
注:当选取的概率越低,访问表的记录数将越多

ORACLE参考手册中的相关说明:
sample_clause
The sample_clause lets you instruct Oracle to select from a random sample of rows from the table, rather than from the entire table.

BLOCK
BLOCK instructs Oracle to perform random block sampling instead of random row sampling.

sample_percent
sample_percent is a number specifying the percentage of the total row or block count to be included in the sample. The value must be in the range .000001 to (but not including) 100.
Restrictions on Sampling During Queries
You can specify SAMPLE only in a query that selects from a single table. Joins are not supported. However, you can achieve the same results by using a CREATE TABLE ... AS SELECT query to materialize a sample of an underlying table and then rewrite the original query to refer to the newly created table sample. If you wish, you can write additional queries to materialize samples for other tables.
When you specify SAMPLE, Oracle automatically uses cost-based optimization. Rule-based optimization is not supported with this clause.
--------------------------------------------------------------------------------
Caution:
The use of statistically incorrect assumptions when using this feature can lead to incorrect or undesirable results.
--------------------------------------------------------------------------------

译:
Sample选项
使用sample选项的意思是指定Oracle从表中随机选择记录样本,这样比从整个表中选择更高效.
block选项
加上 BLOCK选项时表示随机取数据块,而不是随机取记录行.
sample_percent选项
sample_percent是指定总记录行或数据块为数据样本的百分比数值,这个值只能在0.000001到100之间,且不能等于100
限制
只能在单表查询的SQL中指定sample选项,不支持有连接的查询。但是,你可以使用CREATE TABLE ... AS SELECT查询的语法完成同样的效果,然后再采用新建的样本表重新编写查询SQL。
当你指定用sample时,不支持基于规则(rule)的优化法则,ORACLE自动使用基本成本(cost)的优化法则.
注意:
The use of statistically incorrect assumptions when using this feature can lead to incorrect or undesirable results.
这句话不太理解,估计是说采用样本采集特性可能会产生不准确的结果集。
分享到:
评论

相关推荐

    Oracle里抽取随机数的多种方法

    在 Oracle 中抽取随机数是许多应用场景中常见的问题,例如在某个活动中需要随机取出一些符合条件的用户,以颁发获奖通知或其它消息。本文将通过实例讲解如何抽取随机数的多种方法。 首先,我们可以使用 Oracle 自带...

    SQL随机提取N条记录

    这里我们将深入探讨如何在SQL中实现这一功能,以满足“SQL随机抽取N条记录”的需求。 首先,我们需要理解SQL的基本查询结构。SQL查询通常包括SELECT语句,用于指定要从数据库中检索哪些列;FROM语句,指定数据源;...

    富士通内部培训ORACLE资料

    9. **随机抽取记录**:要随机抽取前N条记录,可以结合`ROWNUM`和`ORDER BY DBMS_RANDOM.VALUE`实现。 10. **指定范围抽取记录**:从N行到M行的记录可通过子查询配合`ROWNUM`实现,如 `(SELECT * FROM table WHERE ...

    oracle常用问题解答

    **问题**: 如何在Oracle中随机抽取前N条记录? **解答**: 可以使用`RAND`函数配合`RANK`函数来实现。 - **示例**: 抽取前5条记录: ```sql SELECT * FROM ( SELECT t.*, RANK() OVER (ORDER BY DBMS_RANDOM.VALUE...

    Oracle高级sql学习与练习

    25. 随机值查询处理在数据库中生成随机数据的需求,如随机数或随机抽取记录等。 在学习这些高级SQL技能的过程中,建议通过大量的实践练习,结合具体的应用场景来加深理解,从而有效地掌握这些复杂的数据库操作技术...

    Oracle维护常用SQL语句

    #### 三、随机抽取N条记录 在Oracle中,随机抽取数据可以通过`SYS_GUID()`或`DBMS_RANDOM.VALUE`函数实现。以下是两种方法: 1. 使用`SYS_GUID()`函数: ```sql SELECT * FROM ( SELECT * FROM TABLENAME ORDER...

    基于oracle的在线考试系统的设计

    题目表(QUESTION)应包含题目ID、题目内容、答案、分值等,便于随机抽取试题。最后,成绩表(SCORE)用于存储用户考试成绩,包括用户ID、考试ID、得分等字段。 二、创建视图 视图是数据库中的虚拟表,它根据用户...

    oracle chm帮助文件下载

    9. **随机抽取记录**:可以使用`ROWNUM`结合子查询来随机抽取前N条记录。抽取特定范围的记录可以使用`ROWNUM BETWEEN`。 10. **抽取重复记录**:使用`GROUP BY`和`HAVING`结合可以找出表中的重复记录。 11. **自治...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part1

    实例132 随机抽取数组中元素 161 实例133 二维数组的输出 162 实例134 获取数组当前的键名和值 162 实例135 检测数组中是否存在某个值 163 实例136 获取数组中的当前单元 164 实例137 从数组中随机取出元素 165 实例...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part2

    实例132 随机抽取数组中元素 161 实例133 二维数组的输出 162 实例134 获取数组当前的键名和值 162 实例135 检测数组中是否存在某个值 163 实例136 获取数组中的当前单元 164 实例137 从数组中随机取出元素 165 实例...

    数据分析师面试试题汇总.docx

    - **n-grams**: 连续出现的n个词构成的序列,常用于自然语言处理。 - **MapReduce**: 一种分布式计算模型,适用于大规模数据集的并行处理。 - **余弦距离**: 用于衡量两个向量之间的角度差异,常用于文本相似性...

Global site tag (gtag.js) - Google Analytics