DB/Oracle Administrator

SQL문처리과정 이해

soccerda 2012. 7. 6. 00:45
반응형
SEKECT문의 처리과정

데이터베이스의 성능튜닝을 원활하게 수행하기 위해서는 DB구조에 대한 완벽한 이해는 필수적 입니다. 3가지 유형의 SQL문 처리과정을 통해 오라클 서버구조에 대해 알아 보도록 하겠습니다. 위 3가지 유형중에 한가지 유형을 선택하십시오.

지금부터 SELECT문을 처리하는 과정을 통해 오라클 데이터베이스의 구조를 알아보도록 하겠습니다. ( 위 그림의 "클릭" 버튼을 누르시면 "SELECT문의 처리과정"을 그림을 통해 이해할 수 있습니다.)

현재, 데이터베이스는 시작 명령어(STARTUP)에 의해 인스턴스 영역(메모리 영역과 백그운드 프로세스 영역)과 파일영역이 사용 가능한 상태입니다.

한 명의 사용자가 SCOTT/TIGER로 데이터베이스에 새로운 접속을 요구합니다. 사용자의 클라이언트 영역(P/C)에는 접속정보와 시간정보를 포함하는 하나의 사용자 프로세스가 활성화됩니다. 서버측 에는 하나의 서버 프로세스가 활성화됩니다. SQL*PLUS 툴에는 SQL> 프롬프트가 나타나고 사용자는 SELECT문을 작성합니다. 사용자가 엔터키를 누르면 SELECT문장은 네트워크를 통해 서버 프로세스로 전송이 됩니다. SELECT문을 전송받은 서버 프로세스는 다음과 같은 작업을 실행합니다.

  1. 구문분석 단계

    먼저, 사용자가 실행한 SQL문이 데이터베이스에서 처음 사용된 문장인지 이미 사용된 문장인지를 공유 풀 영역을 검색하여 확인합니다. 확인하는 이유는 이미 사용된 문장이라면 구문분석(Parsing)이라는 작업을 할 필요가 없고 처음 사용되었다면 정상적으로 구문분석 작업을 해야 하기 때문입니다. 구문분석 단계에서는 SQL문의 문법이 제대로 작성되었는지를 분석하고(예를 들어, SELECT가 SLECC로 잘못 작성되지는 않았는지 등) 사용된 테이블, 뷰 등이 존재하는지를('SELECT * FROM emp'에서 EMP 테이블이 데이터베이스 내에 존재하는지) 확인합니다. SQL문이 실행될 때 가장 빠르게 데이터를 검색해줄 수 있는 방법(Explain Plan)도 찾아줍니다.

  2. 실행 단계

    구문분석이 정상적으로 실행되면 서버 프로세스는 메모리 영역의 데이터베이스버퍼 캐시영역을 검색하여 해당 테이블이 다른 사용자의 다른 SQL문에 의해 이미 데이터버퍼 캐시영역에 존재하는지를 검색합니다. 만약, 존재하지 않는다면 정의된 테이블의 해당 데이터 파일로부터 테이블을 읽어서 데이터버퍼 캐쉬영역에 저장합니다.

    만약, 사용자가 UPDATE, DELETE, INSERT문을 실행하였다면 데이터 버퍼캐쉬 영역에서 새로운 데이터로 변경, 삭제 또는 입력하게 됩니다.

  3. 인출단계

    실행단계가 끝나면 서버 프로세스는 데이터버퍼 캐쉬영역에서 관련 테이블 데이터를 읽어서 사용자의 클라이언트(P/C) 화면에 보여줍니다.

    단, SELECT문을 실행하는 경우에만 인출(Fetch)단계가 실행되고 UPDATE, INSERT, DELETE문 실행 시는 인출단계는 실행되지 않습니다. DML문을 실행하는 경우에 실행 결과가 화면에 출력되는지를 생각해 보세여. 몇 건의 행이 변경, 삭제, 입력되었다는 메시지 만 나타나죠 ? 즉, DML문을 실행할 때는 인출단계는 실행되지 않습니다. SELECT문에 만 적용됩니다.

 

DML문의 처리과정

데이터베이스의 성능튜닝을 원활하게 수행하기 위해서는 DB구조에 대한 완벽한 이해는 필수적 입니다. 3가지 유형의 SQL문 처리과정을 통해 오라클 서버구조에 대해 알아 보도록 하겠습니다. 위 3가지 유형중에 한가지 유형을 선택하십시오.

DML(Insert,Update,Delete)문을 실행하는 과정은 SELECT문을 실행하는 과정과 조금 차이가 있습니다. 왜냐하면 테이블로부터 데이터를 읽어서 변경해야 하고 또한 변경작업 후에 COM MIT, ROLLBACK문을 통해 변경작업에 대한 종료 및 취소를 해야 하기 때문입니다. (위 그림의 "클릭" 버튼을 누르시면 "DML문의 처리과정"을 그림을 통해 이해할 수 있습니다.)

만약 COMMIT문을 실행한다면 변경된 내용을 테이블에 저장하는 별도의 과정이 필요할 것이 고 ROLLBACK문을 실행한다면 변경전의 데이터로 복구되어야 하기 때문입니다.

SQL*PLUS 툴의 SQL> 프롬프트 상에서 사용자는 UPDATE문을 작성합니다. 사용자가 엔터키(ENTER-KEY)를 누르면 UPDATE문장은 네트워크를 통해 서버 프로세스로 전송이 되고 구문분석 작업을 실행하게 됩니다. 구문분석 작업이 끝나면 데이터버퍼 캐시영역에 다른 사용자의 SQL문에 의해 해당 테이블이 이미 읽혀졌는지를 검색한 후 존재하지 않으면

  1. 해당 데이터 파일로부터 테이블을 읽고 또한, DML문 작업 시 ROLLBACK문을 실행했을 때 변경 전 데이터로 복구해 주기 위해서 언두 세그멘트를 데이터베이스로부터 읽게 됩니다.
  2. 읽혀진 테이블과 언두 세그멘트는 데이터버퍼 캐시영역에 저장되게 됩니다.
  3. 그리고, 변경하려는 행(ROW)을 다른 사용자의 또 다른 DML문으로부터 안전하게 보호될 수 있도록 잠금(LOCK)을 설정하게 되고 그 잠금 정보를 관련되는 자료사전에 저장하게 됩니다.
  4. 마지막으로, 로그버퍼 영역에는 사용자가 실행한 DML문에 의해 변경된 행의 변경 전 정보와 변경 후의 정보가 저장됩니다. 로그버퍼 영역에 모든 변경된 데이터를 저장하는 이유는 변경작업 후 COMMIT문을 실행했을 때 뜻하지 않는 상황(정전이 되어 시스템이 다운되는 경우 등)이 닥쳐 사용자의 변경작업이 미처 완료되기 전에 데이터베이스가 다운되면 데이터의 유실이 생길 수 있기 때문에 그러한 경우 데이터를 복구해 주기 위해서 로그버퍼 영역에 백업을 하는 것입니다.

 

 

COMMIT문의 처리과정

데이터베이스의 성능튜닝을 원활하게 수행하기 위해서는 DB구조에 대한 완벽한 이해는 필수적 입니다.3가지 유형의 SQL문 처리과정을 통해 오라클 서버구조에 대해 알아 보도록 하겠습니다. 위 3가지 유형중에 한가지 유형을 선택하십시오.

DML문을 실행한 후 변경작업을 종료하려면 Commit문을 실행하며 변경취소를 하려면 Rollba ck문을 실행하게 되는데 그 과정에 대해서 자세히 알아보도록 하겠습니다. (위 그림의 "클릭" 버튼을 누르시면 "COMMIT문의 처리과정"을 그림을 통해 이해할 수 있습니다.)

다음은 사용자가 DML(Insert,Updata,Delete)문을 실행한 후 Commit문을 처리했을 경우 데이터베이스 내부에서 처리되는 과정입니다.

  1. 사용자가 DML 문을 실행한 후 COMMIT문을 실행합니다.
  2. 서버 프로세스는 DML문의 처리결과(변경전의 데이터, 변경후의 데이터)가 저장되어 있는 로그 버퍼영역에 시스템 변경번호(SYSTEM CHANCE NUMBER)를 부여합니다.
  3. 그리고 로그 기록기(LGWR)는 로그버퍼 영역에 있는 변경 데이터를 영구적으로 보관하기 위해 리두로그 파일에 저장합니다.(메모리 영역에는 데이터를 영구히 저장할 수 없기 때문에)
  4. 서버 프로세스는 네트워크를 통해 사용자 프로세스에게 'Committed' 메시지를 전송하고 사용자 프로세스는 SQL*PLUS 화면에 메시지를 출력해 줍니다.
  5. 만약, 로그버퍼 영역의 데이터를 하나의 리두로그 파일에 모두 저장하지 못하면 다음 로그파일로 위치를 이동시킵니다, 이것을 로그 스위치(LOG SWITCH)라고 합니다. 로그 스위 치가 발생하면
  6. CKPT 프로세스는 컨트롤 파일과 데이터 파일의 헤드영역에 시스템 변경 번호와 관련 상태정보를 저장합니다. 이것을 체크포인트 이벤트라고 합니다.
  7. 이 작업이 끝나면 데이터베이스 기록기(DBWR)는 데이터버퍼 캐시영역에 있는 사용자의 변경정보를 최종적으로 테이블에 저장합니다.
반응형

'DB > Oracle Administrator' 카테고리의 다른 글

오라클 구조(Architecture) 2  (0) 2012.07.06
튜닝 방법론 이해  (0) 2012.07.06
SQL문 분석의 이해  (0) 2012.07.06
오라클 서버 구조  (0) 2012.07.06
오라클 구조 pdf 파일  (0) 2012.07.06