Oacle 랜 덤 으로 줄 가 져 오기

2335 단어 Oacle무 작위 줄
Oracle 액세스 데이터 의 기본 방법 은 다음 과 같다.
1. 시계 전체 스 캔
2. 샘플링 테이블 스 캔
 
전체 테이블 스 캔 (Full table Scan)
전체 표 스 캔 은 표 의 모든 기록 을 되 돌려 줍 니 다.
전체 표 스 캔 을 실행 하고 Oracle 은 표 의 모든 기록 을 읽 으 며 각 줄 이 WHERE 조건 을 만족 시 키 는 지 확인 합 니 다.Oracle 순서의 읽 기 는 이 표 의 모든 데이터 블록 에 분 배 됩 니 다. 그러면 전체 표 스 캔 은 여러 개의 읽 기 에 도움 이 될 수 있 습 니 다.
각 데이터 블록 Oracle 은 한 번 만 읽 습 니 다.
 
샘플링 테이블 스 캔 (sample table scan)
샘플링 표 스 캔 반환 표 에서 무 작위 샘플링 데이터.
이러한 접근 방식 은 FROM 구문 에 SAMPLE 옵션 이나 SAMPLE BLOCK 옵션 을 포함 해 야 합 니 다.
SAMPLE 옵션: 샘플링 표 스 캔 을 줄 별로 실행 할 때 Oracle 은 표 에서 특정 백분율 의 기록 을 읽 고 WHERE 자 구 를 만족 시 키 는 지 판단 하여 결 과 를 되 돌려 줍 니 다.
샘플링 스 캔 방식 을 사용 하면 Oacle 의 최적화 기 CBO 가 자동 으로 실 행 됩 니 다.
 
100 만 데이터, sample 방식 을 사용 할 때 평균 15 - 31 밀리초 에 기록 을 되 돌 릴 수 있 으 며, order by dbms 를 사용 합 니 다.random. random 은 평균 400 밀리초 가 필요 합 니 다.
SELECT accountnumber, batchno, sequence
FROM e_pin
WHERE sequence=
     (SELECT sequence FROM 
	(SELECT sequence FROM e_pin WHERE salecardflag='0' AND rownum<1000 ORDER BY dbms_random.random) WHERE rownum=1);
			
SELECT accountnumber, batchno, sequence FROM e_pin sample(10) where salecardflag='0' and rownum<=1;	

 
저장 프로시저:
CREATE OR REPLACE PROCEDURE p_e_pin(
	i_result 		OUT NUMBER, 
	s_accountnumber OUT VARCHAR2, 
	s_batchno 		OUT VARCHAR2, 
	s_sequence 		OUT VARCHAR2
)
AS 

no_evoucher EXCEPTION;

BEGIN
	i_result:=0;
	
	BEGIN
	SELECT accountnumber, batchno, sequence
	INTO s_accountnumber, s_batchno, s_sequence
	FROM u_uvc_evoucher sample(10) where salecardflag='0' and rownum<=1 FOR UPDATE skip locked;
	
	EXCEPTION
        WHEN NO_DATA_FOUND THEN
			RAISE no_evoucher;
	END;		
			
	UPDATE e_pin SET salecardflag='4' WHERE sequence = s_sequence AND salecardflag='0';
    IF SQL%NOTFOUND THEN
        RAISE no_evoucher;
    END IF;

	COMMIT;
	
	EXCEPTION
		WHEN no_evoucher THEN
			i_result:=-1;
            s_accountnumber:='';
            s_batchno:='';
            s_sequence:='';
			ROLLBACK;	
END p_e_pin;
/

좋은 웹페이지 즐겨찾기