Oracle

게시글 보기
작성자 유건데이타 등록일 2015-08-13
제목 TABLE에서 RANDOM하게 DATA를 가져오는방법
TABLE에서 RANDOM하게 DATA를 가져오는방법
======================================

PURPOSE
-------

아래의 내용은 Sample table scan을 통해서 table의 data를 가져올 때 마다
result set에서 Random하게 가져오는 방법을 기술하고 있습니다.
8i의 새로운 기능입니다.

Explanation
-----------

기본적으로 오라클은 data를 access할 때는

1)Full table scan
2) Sample table scan.

의 두 가지 방법이 있습니다.


1. Full Table Scan

이 방법은 table의 모든 행을 scan한 후 가져오는 방법입니다.
Full table scan을 위해서 Oracle은 table의 모든 row들을 읽고
각각의 행이 where 조건에 만족하는지는 확인합니다. Oracle은
table에 관련된 모든 block을 차례로 읽기 때문에 full table scan은
multiblock 읽기를 통해서 효율적으로 이루어 집니다.


2. Sample Table Scan

Sample table scan 은 table의 data중 무작위적으로 sample을
가져옵니다. 이러한 방법은 SQL문장의 FROM 절에 SAMPLE
option 이나 SAMPLE BLOCK option을 기술 해 줌으로써
사용되어 집니다.


SAMPLE option

Sample table scan은 row 단위로 sample data를 가져올 때
사용하는 option 입니다. (SAMPLE option),
Oracle 은 특정 비율(%)의 row를 테이블에서 읽은 후 각각의
Row가 WHERE 절의 조건에 만족하는지 확인 합니다.


SAMPLE BLOCK option

Sample table scan은 block 단위로 sample data를 가져올 때
사용하는 option 입니다. (SAMPLE BLOCK option),
Oracle 은 특정 비율(%)의 테이블 block을 읽은 후 각각의 row가
WHERE 절에 만족하는지 확인 합니다.


Sample_Percent

Sample_percent 은 전체 row 또는 sample이 포함된 block중에서
가져올 비율(%)를 지정해 줍니다. Sample value 은 반드시
0.000001 와 99.999999 사이에 존재 하여야 합니다.


Example
--------

SQL> SELECT * FROM emp SAMPLE (30);

EMPNO ENAME JOB MGR HIREDATE SAL COMM
DEPTNO
----- ---------- --------- --------- --------- --------- --------- -----

7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300
30
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400
30
7902 FORD ANALYST 7566 03-DEC-81 3000
20




SQL> SELECT * FROM emp SAMPLE BLOCK (10);

EMPNO ENAME JOB MGR HIREDATE SAL COMM
DEPTNO
----- ---------- --------- --------- --------- --------- ---------
------
7521 WARD SALESMAN 7698 22-FEB-81 1250
500 30
7934 MILLER CLERK 7782 23-JAN-82
1300 10



제약사항

1. 하나의 테이블에서 select할 경우만 사용하실 수 있습니다.
Join이나 remote table은 지원하지 않습니다.

2. SAMPLE option은 사용하실 때, Oracle은 자동적으로 cost-based
optimizer를
사용하게 됩니다. Rule-based optimizer 은 지원되지 않습니다.

3. View는 지원하지 않습니다.

SQL> CREATE VIEW sample_view AS SELECT * FROM emp SAMPLE (30);
CREATE VIEW sample_view AS SELECT * FROM emp SAMPLE (30)
*
ERROR at line 1:
ORA-00933: SQL command not properly ended

4. 8.1.6 이하에서는 PL/SQL 에서 SAMPLE BLOCK을 지원하지 않습니다.

8.1.5 에서는 아래와 같은 error가 발생합니다.

SQL> ed sample.sql

DECLARE
CURSOR C1 IS
SELECT * FROM emp SAMPLE (10);
C1_rec c1%ROWTYPE;
temp number := 0;
BEGIN
OPEN C1;
WHILE temp = 1 LOOP
FETCH c1 INTO c1_rec;
IF c1%NOTFOUND THEN
temp := 0;
ELSE
DBMS_OUTPUT.PUT_LINE(TO_CHAR(c1_rec.empno));
END IF ;
end LOOP;
CLOSE c1;
END;
/

SQL> @sample.sql
SELECT * FROM emp SAMPLE (10);
*
ERROR at line 3:
ORA-06550: line 3, column 34:
PLS-00103: Encountered the symbol "(" when expecting one of the
following:
, ; for group having intersect minus order start union where
connect
The symbol "having" was substituted for "(" to continue.

5. 작은 수의 row를 가진 table에서 sample이나 sample block option을
사용 시에는 일정 비율(%)의 sample data가 return되지 않을 수도
있습니다.


Reference Documents
---------------------
1. Note:95455.1

2. ORACLE 8i, SQL Reference, Volume 2, Release 8.1.5 (PartA67795-01),
Chapter 7: SQL Statements, Pages 7-542 to 7-546.

3. ORACLE 8i, Concepts, Volume 2, Release 8.1.5 (Part A67783-01),
Chapter 23: Optimizer Operations, Page 23-34.


OTN
Comment
등록된 코멘트가 없습니다.