oracle--隨機查詢 -sample


從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 emp sample(20);

EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
 7566 JONES      MANAGER    7839 1981-4-2      2866.00               20
 7654 MARTIN     SALESMAN   7698 1981-9-28     2866.00   1400.00     30
 7698 BLAKE      MANAGER    7839 1981-5-1      2866.00               30
 7839 KING       PRESIDENT       1981-11-17    2866.00               10

2、使用SAMPLE BLOCK選項

SQL> select * from emp sample block(35);

EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
 7369 SMITH      CLERK      7902 1980-12-17    3066.00               20
 7499 ALLEN      SALESMAN   7698 1981-2-20     2866.00    300.00     30
 7521 WARD       SALESMAN   7698 1981-2-22     2866.00    500.00     30
 7566 JONES      MANAGER    7839 1981-4-2      2866.00               20
 7654 MARTIN     SALESMAN   7698 1981-9-28     2866.00   1400.00     30
 7698 BLAKE      MANAGER    7839 1981-5-1      2866.00               30
 7782 CLARK      MANAGER    7839 1981-6-9      2866.00               10
 7788 SCOTT      ANALYST    7566 1987-4-19     2866.00               20
 7839 KING       PRESIDENT       1981-11-17    2866.00               10
 7844 TURNER     SALESMAN   7698 1981-9-8      2866.00      0.00     30
 7876 ADAMS      CLERK      7788 1987-5-23     2866.00               20
 7900 JAMES      CLERK      7698 1981-12-3     2866.00               30
 7902 FORD       ANALYST    7566 1981-12-3     2866.00               20
 7934 MILLER     CLERK      7782 1982-1-23     2866.00               10

14 rows selected

3、采樣前n條記錄的查詢

也可以使用dbms_random包實現

SQL> select * from (
  2  select * from emp order by dbms_random.value)
  3  where rownum < 4;

EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
 7839 KING       PRESIDENT       1981-11-17    2866.00               10
 7902 FORD       ANALYST    7566 1981-12-3     2866.00               20
 7654 MARTIN     SALESMAN   7698 1981-9-28     2866.00   1400.00     30

SQL> select * from (
  2  select * from emp order by dbms_random.random)
  3  where rownum < 5;

EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
 7934 MILLER     CLERK      7782 1982-1-23     2866.00               10
 7844 TURNER     SALESMAN   7698 1981-9-8      2866.00      0.00     30
 7369 SMITH      CLERK      7902 1980-12-17    3066.00               20
 7876 ADAMS      CLERK      7788 1987-5-23     2866.00               20

主要注意以下幾點:

1.sample只對單表生效,不能用於表連接和遠程表
2.sample會使SQL自動使用CBO

(補充:隨機連續10條記錄)

SELECT * FROM
(   SELECT *   FROM TABLE
WHERE ROWNUM <=
        (SELECT MAX(FLOOR(DBMS_RANDOM.VALUE(0,(SELECT COUNT(*) FROM TABLE)))) FROM TABLE WHERE ROWNUM <= 10)
        ORDER BY ROWNUM DESC)
        WHERE Rownum<=10;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM