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;
