大数据集表随机取数据
select *
from (select *
from table_name sample(10)
order by trunc(dbms_random.value(0, 1000)))
where rownum = 1;
sample(10):含义为检索表中的10%数据
从Oracle8i开始Oracle提供采样表扫描特性
Oracle访问数据的基本方法有:
1.全表扫描
2.采样表扫描
全表扫描(Full table Scan)
全表扫描返回表中所有的记录。
执行全表扫描,Oracle读表中的所有记录,考查每一行是否满足WHERE条件。Oracle顺序的读分配给该表的每一个数据块,这样全表扫描能够受益于多块读.
每个数据块Oracle只读一次.
采样表扫描(sample table scan)
采样表扫描返回表中随机采样数据。
这种访问方式需要在FROM语句中包含SAMPLE选项或者SAMPLE BLOCK选项.
SAMPLE选项:
当按行采样来执行一个采样表扫描时,Oracle从表中读取特定百分比的记录,并判断是否满足WHERE子句以返回结果。
SAMPLE BLOCK选项:
使用此选项时,Oracle读取特定百分比的BLOCK,考查结果集是否满足WHERE条件以返回满足条件的纪录.
Sample_Percent:
Sample_Percent是一个数字,定义结果集中包含记录占总记录数量的百分比。
Sample值应该在[0.000001,99.999999]之间。
1.使用SAMPLE选项
SQL> select * from employee SAMPLE(30);
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 800 20
7788 SCOTT ANALYST 7566 19-APR-87 3000 20
7839 KING PRESIDENT 17-NOV-81 5000 10
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=25 Bytes=2175)
1 0 TABLE ACCESS (SAMPLE) OF 'EMPLOYEE' (Cost=2 Card=25 Bytes=2175)
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
5 consistent gets
0 physical reads
0 redo size
880 bytes sent via SQL*Net to client
503 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
3 rows processed
SQL> select * from employee SAMPLE(20);
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=16 Bytes=1392)
1 0 TABLE ACCESS (SAMPLE) OF 'EMPLOYEE' (Cost=2 Card=16 Bytes=1392)
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
5 consistent gets
0 physical reads
0 redo size
839 bytes sent via SQL*Net to client
503 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
2 rows processed
|
2.使用SAMPLE BLOCK选项
SQL> SELECT * FROM employee SAMPLE BLOCK (50);
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 800 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7566 JONES MANAGER 7839 02-APR-81 2975 20
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7788 SCOTT ANALYST 7566 19-APR-87 3000 20
7839 KING PRESIDENT 17-NOV-81 5000 10
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
10 rows selected.
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=41 Bytes=3567)
1 0 TABLE ACCESS (SAMPLE) OF 'EMPLOYEE' (Cost=2 Card=41 Bytes=3567)
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
4 consistent gets
0 physical reads
0 redo size
1162 bytes sent via SQL*Net to client
503 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
10 rows processed
SQL>
|
3.采样前n条记录的查询
也可以使用dbms_random包实现
SQL> select * from (
2 select * from employee
3 order by dbms_random.value )
4 where rownum <= 4;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
7839 KING PRESIDENT 17-NOV-81 5000 10
7369 SMITH CLERK 7902 17-DEC-80 800 20
7788 SCOTT ANALYST 7566 19-APR-87 3000 20
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE
1 0 COUNT (STOPKEY)
2 1 VIEW
3 2 SORT (ORDER BY STOPKEY)
4 3 TABLE ACCESS (FULL) OF 'EMPLOYEE'
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
3 consistent gets
0 physical reads
0 redo size
927 bytes sent via SQL*Net to client
503 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
4 rows processed
|
对比一下SAMPLE选项
SQL> SELECT * FROM employee SAMPLE (40);
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
7839 KING PRESIDENT 17-NOV-81 5000 10
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=33 Bytes=2871)
1 0 TABLE ACCESS (SAMPLE) OF 'EMPLOYEE' (Cost=2 Card=33 Bytes=2871)
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
5 consistent gets
0 physical reads
0 redo size
961 bytes sent via SQL*Net to client
503 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
5 rows processed
SQL>
|
主要注意以下几点:
1.sample只对单表生效,不能用于表连接和远程表
2.sample会使SQL自动使用CBO
分享到:
相关推荐
### Oracle数据库中的海量数据处理 #### 数据仓库系统的特点与Oracle数据仓库简介 数据仓库系统是一种专门设计用于存储、管理和分析企业历史数据的信息管理系统。它的特点包括面向主题、集成性、随时间变化以及非...
在Oracle数据库管理中,生成大量测试数据是进行性能测试、数据建模以及验证查询效率等场景下不可或缺的一环。本文将深入探讨如何利用一条SQL语句在Oracle中快速生成10万条测试数据,这对于数据库管理员和开发人员来...
在Oracle数据库中,通过一条SQL语句快速生成大量测试数据是一项非常实用的技能。本文将详细介绍如何利用Oracle中的特性来实现这一目标。 ### 核心知识点:使用一条SQL语句快速生成10万条测试数据 #### 1. 使用`...
在 Oracle 中抽取随机数是许多应用场景中常见的问题,例如在某个活动中需要随机取出一些符合条件的用户,以颁发获奖通知或其它消息。本文将通过实例讲解如何抽取随机数的多种方法。 首先,我们可以使用 Oracle 自带...
标题“Oracle创造测试数据”指的是在Oracle数据库环境中创建模拟真实业务场景的数据,这对于软件测试、性能测试、系统分析等过程至关重要。Oracle数据库是全球广泛使用的大型关系型数据库管理系统,其强大的功能使得...
在Oracle中,可以先通过`GROUP BY`对数据进行分组,再从每个分组中随机选取记录,以此来模拟整群抽样的效果。 #### 4. 分层抽样 分层抽样是将总体按照某些特征划分成不同的层,然后从每一层中随机抽取样本。在...
在Oracle中,如果需要获取刚插入的数据的ID值,可以使用`CURRVAL`属性,它返回最近一次调用`NEXTVAL`所生成的值。例如,在插入数据后立即查询`seq_atable.CURRVAL`: ```sql SELECT seq_atable.CURRVAL FROM dual; `...
例如,如果你想要从表`users`中随机抽取5条记录,可以使用以下查询: ```sql SELECT * FROM users ORDER BY RAND() LIMIT 5; ``` 这将返回一个无特定顺序的随机5条记录。 2. **在SQL Server中随机抽取**: ...
适用于随机数据分布的情况。 示例代码: ```sql CREATE TABLE HASH_TABLE ( ID NUMBER PRIMARY KEY, NAME VARCHAR2(50), DATA VARCHAR2(100) ) PARTITION BY HASH(ID) ( PARTITION HASH_PART1 TABLESPACE HASH_...
在Oracle数据库管理中,有时我们需要向数据库表中插入大量的随机数据来进行测试、演示或者数据模拟分析等工作。本篇文章将详细介绍如何利用自定义的Oracle函数来实现这一功能。 #### 自定义Oracle函数 为了实现向...
数据挖掘是指从大量的、不完全的、有噪声的、模糊的、随机的实际应用数据中,提取隐含在其中的、人们事先不知道的、但又是潜在有用的信息和知识的过程。这些信息或知识可以用来预测趋势和未来模式,帮助决策者做出更...
总结来说,`ROWNUM`是Oracle数据库中一种强大的工具,它可以方便地用于选取特定行或实现分页查询,但在处理并发操作时需要注意并发控制,以防止数据不一致。了解并熟练掌握`ROWNUM`以及相关的分析函数,对于优化...
Oracle表分区是指在大型数据库中,将表分割成更小的物理部分的过程。这些部分被称为分区,它们在逻辑上属于同一个表,但在物理上可以存储在不同的表空间中。通过分区,可以提高数据管理的灵活性、提升数据库的性能和...
**问题**: 如何在Oracle中随机抽取前N条记录? **解答**: 可以使用`RAND`函数配合`RANK`函数来实现。 - **示例**: 抽取前5条记录: ```sql SELECT * FROM ( SELECT t.*, RANK() OVER (ORDER BY DBMS_RANDOM.VALUE...
这个查询将返回`Employees`表的所有记录,但它们的顺序是基于系统生成的唯一标识符(NEWID()在SQL Server中,或者RAND()在某些其他数据库系统中),从而实现随机排序。 4. **绑定数据**:在Delphi中,可以通过...
25. 随机值查询处理在数据库中生成随机数据的需求,如随机数或随机抽取记录等。 在学习这些高级SQL技能的过程中,建议通过大量的实践练习,结合具体的应用场景来加深理解,从而有效地掌握这些复杂的数据库操作技术...
本文将深入探讨在Oracle数据库操作中涉及的一些关键知识点,包括记录集的显示、时间的SQL转换、汉字的随机选取以及事务处理等。 1. **子程序_显示记录集信息**: 在Oracle数据库操作中,我们经常需要从查询结果中...
5. Oracle表空间:在Oracle数据库中,表空间是一个逻辑单位,由一个或多个数据文件组成。Oracle数据库实质上包括三种类型的表空间:undo表空间、临时表空间以及“其余的”表空间。特殊的表空间如SYSTEM表空间和...
Oracle分区表是一种数据库技术,用于将大型表或索引物理地分割成多个部分,以提高查询性能、简化数据管理并减少资源消耗。通过分区,可以将数据分布到不同的表空间,实现更高效的数据访问和维护操作。 ### 二、范围...