Oracle 하 드 분석 및 소프트 분석

다음 내용 은 네트워크 에서 전 환 됩 니 다.
-------------------------------------
소프트 해석 (soft prase) 과 하 드 해석 (hard prase) 하면 Oracle 이 sql 에 대한 처리 과정 을 말 하지 않 을 수 없다.Oracle 에 sql 문 구 를 보 내 면 결 과 를 실행 하고 얻 기 전에 Oracle 은 이 sql 에 대해 몇 가지 절차 의 처리 과정 을 진행 할 것 입 니 다.
1. 문법 검사 (syntax check)  이 sql 의 맞 춤 법 이 합 법 적 인지 확인 합 니 다.2. 의미 검사 (semantic check)  예 를 들 어 sql 문장의 방문 대상 이 존재 하 는 지, 그리고 이 사용자 가 해당 하 는 권한 을 가지 고 있 는 지 확인 합 니 다.3. sql 문 구 를 분석 (prase)  내부 알고리즘 을 이용 하여 sql 을 분석 하고 분석 트 리 (parse tree) 와 실행 계획 (execution plan) 을 생 성 합 니 다.4. sql 을 실행 하고 결 과 를 되 돌려 줍 니 다 (execute and return)
그 중에서 부 드 럽 고 딱딱 한 해석 은 세 번 째 과정 에서 발생 한다.
Oracle 은 내부 의 hash 알고리즘 을 이용 하여 이 sql 의 hash 값 을 얻 은 다음 library cache 에서 이 hash 값 이 존재 하 는 지 찾 습 니 다.존재 한다 고 가정 하면 이 sql 과 cache 의 비교;'같다' 고 가정 하면 기 존의 해석 트 리 와 실행 계획 을 이용 하여 최적화 기의 관련 작업 을 생략 합 니 다.이것 이 바로 소프트 해석 의 과정 이다.
물론 위의 두 가설 중 하나 가 성립 되 지 않 는 다 면 유 틸 리 티 는 분석 트 리 를 만 들 고 실행 계획 을 만 드 는 동작 을 할 것 입 니 다.이 과정 을 딱딱 한 해석 이 라 고 한다.
분석 트 리 를 만 들 고 실행 계획 을 만 드 는 것 은 sql 의 실행 에 있어 비용 이 비 싼 동작 이 므 로 하 드 해석 을 피하 고 소프트 해석 을 사용 해 야 합 니 다.
이것 이 바로 많은 프로젝트 에서 개발 설계 자 들 이 기능 이 같은 코드 에 대해 코드 의 일치 성 을 유지 하고 프로그램 에서 바 인 딩 변 수 를 많이 사용 해 야 한 다 는 것 을 제창 하 는 이유 이다.
다음 과 같은 두 개의 검색 어가 있 습 니 다.
1.SELECT * FROM EMP WHERE EMPNO = 123;
2.SELECT * FROM EMP WHERE EMPNO = :EMP_NO;
1 문장 에서 직원 번 호 를 조회 하 는 것 은 123 의 직원 정보 로 ORACLE 는 처음으로 분석 과 컴 파일 을 거 쳐 집행 한다.그러나 다음 에 456 번 과 789 번 의 직원 정 보 를 다시 조회 해 야 할 경우 ORACLE 는 이 SQL 분석 을 컴 파일 한 다음 에 실 행 될 것 이다.
두 문장 더 보기, 우선 변수 EMP 정의NO. 저 희 는 123 을 변수 에 부여 합 니 다. 첫 번 째 때 도 분석 과 컴 파일 을 거 쳐 실 행 됩 니 다. 그러나 다음 에 다른 직원 번호 의 정 보 를 조회 하려 고 할 때 ORACLE 는 첫 번 째 컴 파일 후의 조회 방안 (첫 번 째 컴 파일 이 실 행 된 후에 공유 탱크 에 저장 되 었 습 니 다) 을 다음 조회 에 사용 합 니 다.
이것 은 JAVA 와 같 습 니 다. 생각해 보 세 요. 만약 에 JAVA 로 소프트웨어 를 썼 다 면 고객 에 게 쓴 JAVA 코드 입 니 다. 고객 은 사용 할 때마다 코드 를 컴 파일 하고 실행 해 야 합 니 다.얼마나 큰 영향 을 미 치 겠 습 니까?
따라서 하 드 코딩 변 수 를 가 진 문 구 를 분석 하 는 데 현저 한 비중 을 분석 하고 이미 분석 한 조회 방안 (소프트 분석) 을 사용 하 는 데 더 많은 시간 과 더 많은 자원 을 소모 해 야 한다.
바 인 딩 변 수 를 사용 하면 같은 변 수 를 참조 하 는 똑 같은 조 회 를 제출 한 사람 은 공유 탱크 의 컴 파일 방안 을 사용 합 니 다. 하위 루틴 을 한 번 만 컴 파일 하면 중복 사용 할 수 있 습 니 다.이렇게 하면 비교적 적은 시간 을 사용 할 수 있 을 뿐만 아니 라 잠 금 저장 시간 을 줄 이 고 잠 금 저장 빈 도 를 낮 출 수 있다.이것 은 소프트웨어 의 성능 을 향상 시 켜 신축성 을 크게 높 일 것 이다.
아래 의 실험 은 이 이 치 를 더욱 설명 할 수 있 을 것 이다.
 
ALTER SYSTEM FLUSH SHARED_POOL;

SET SERVEROUTPUTON;

SET TIMINGON;

DECLARE
          TYPE rc IS REF CURSOR;
          l_rc rc;
          l_dummy all_objects.object_name%TYPE;
          l_start NUMBER DEFAULT dbms_utility.get_time;
BEGIN
          FOR i IN 1 ..1000 LOOP
          OPEN l_rc FOR 'select object_name from all_objects where object_id = '||i;
          FETCH l_rc INTO l_dummy;
          CLOSE l_rc;
          END LOOP;
          dbms_output.put_line(round((dbms_utility.get_time-l_start)/100,2)||'seconds ...');    
END;


 
 
PL / SQL 프로 세 스 가 성공 적 으로 완료 되 었 습 니 다.
사용 한 시간:   00: 00: 53.05
위 코드 는 동적 SQL 을 사용 하여 ALLOBJECTS 표 에서 단일 줄 을 조회 합 니 다.이 는 값 1, 2, 3.............................................................................다음 코드 를 보십시오.
 
DECLARE
        TYPE rc IS REF CURSOR;
        l_rc rc;
        l_dummy all_objects.object_name%TYPE;
        l_start NUMBER DEFAULT dbms_utility.get_time;
BEGIN
        FOR i IN 1 ..1000 LOOP
        OPEN l_rc FOR 'select object_name from all_objects where object_id = :x' USING i;
        FETCH l_rc INTO l_dummy;
        CLOSE l_rc;
        END LOOP;
        dbms_output.put_line(round((dbms_utility.get_time-l_start)/100,2)||'seconds ...');
END;


 
 
PL / SQL 프로 세 스 가 성공 적 으로 완료 되 었 습 니 다.사용 한 시간:   00: 00: 00.03
!!!!!!!    0.03 초 차이 가 이렇게 크다. 코드 를 돌 이 켜 보면 두 번 째 는 순환 체 에서 변수 X 를 사용 하여 i 의 값 을 X 에 부여 했다. 그러면 ORACLE 는 실행 할 때 한 번 만 컴 파일 하고 다른 999 번 은 공유 탱크 에서 조회 방안 을 사용 하 며 조회 시간 과 속도 가 당연히 빠르다.그 러 니까소프트웨어 개발 의 처음부터 귀속 변수의 중요성 을 인식 해 야 한다.
 ------------------------
Present  By  Dylan.

좋은 웹페이지 즐겨찾기