'태그를 입력해 주세요.'에 해당되는 글 1건

  1. 2013.08.27 오라클 액세스와 시스템 뷰


유저 프로세스와 서버 프로세스

해당 클라이언트(Client) 시스템에 유저 프로세스가 기동되게 된다. 

기동된 유저 프로세스는 해당 세션 정보와 실행된 SQL 정보를 가지고 데이터베이스 서버로 해당 SQL 수행을 요청하게 된다.


**유저 프로세스의 요청을 해당 데이터베이스 서버가 공유 서버(MTS) 환경이 아니라면 하나의 서버 프로세스가 해당 요청을 접수하게 된다.




[이미지=oraclecoursebooks.com] SQL 수행 절차



SQL 수행에 대한 전체 개요

서버 프로세스와 구문 분석 (Parsing)

서버 프로세스를 할당 받았다면 해당 서버 프로세스 에 의해 실제 SQL이 수행됨

서버 프로세스는 공유 풀의 라이브러리 캐쉬에 해당 SQL에 대해 구문 분석을 의뢰함


구문 분석 절차

① 검색 (Search)

-Hard Parsing: 공유풀에 SQL에 대한 구문 분석이 존재하지 않을 경우 구문 분석을 처음부터 수행

-Soft Parsing: 공유풀에 SQL에 대한 구문 분석이 존재할 경우 기존 구문 분석 이용

② 문장 확인 (Syntax Check)

③ 데이터베이스 분석 (Database Resolution)

④ 단순화 (Simple Transformation)

-오라클 옵티마이저가 좀더 좋은 실행 계획을 생성하기 위해 내부적으로 SQL 변경

⑤ 권한 확인

-유저가 수행한 SQL에 대해 권한이 존재하며, SQL이 DML이면 해당 테이블에 대해 TM락 수행

⑥ 락 (TM Lock)

⑦ 실행 계획 및 구문 분석 트리 (Parsing Tree) 생성

-구문 분석의 결과물. 대상 SQL과 함께 공유 풀에 저장됨



데이터 딕셔너리 확인

구문 분석 단계 중 데이터베이스 분석 단계를 수행하기 위해 데이터 딕셔너리를 확인


시스템 테이블스페이스에 존재하는 데이터 딕셔너리를 조회

-작업에 사용되는 테이블 존재 유무 확인

-해당 테이블에서 필요한 컬럼 존재 유무 확인


**데이터 딕셔너리: 해당 DB에 존재하는 모든 오브젝트 정보와 모든 컬럼 및 유저 정보 존재


권한 확인에서도 데이터 딕셔너리 이용. 

데이터 딕셔너리에 모든 유저의 권한 정보를 저장하고 있기 때문.



로그 기록

실제 작업을 수행하기 전에 선 로그 기법에 의해 리두 로그 버퍼에 변경 내용 기록.


**오라클은 선 로그 기법(Log Ahead) 사용. 

**선 로그 기법 : DML(Insert, Delete, Update) 작업을 수행할 경우 실제 데이터에 대해 DML을 수행하기 전에 데이터들의 변경에 대한 내용을 리두 로그 버퍼에 미리 저장하게 된다.



대상 집합 락(Lock) 처리

실제 변경을 수행하고자 하는 행에 대해 락을 수행

변경 대상 로우에 락을 수행. 해당 락은 TX락이라 부름.


**TX락 : 오직 변경하는 유저만이 해당 로우를 엑세스할 수 있는 락

조회하는 유저에 대해서는 조회가 가능하지만, 

다른 서버 프로세스에서 해당 로우를 변경하기 위해서는 앞에서 수행된 TX락이 종료될 때까지 대기해야 함



변경 이전 이미지 저장 준비


언두 테이블스페이스에 존재하는 언두 세그먼트의 언두 블록을 할당 받아 이전 이미지를 저장할 준비를 함


** 실제 변경 작업 수행 전에 변경이 이루어 질 데이터에 대해 이전 이미지를 저장해야 하는 이유

-롤백 수행 지원

-읽기 일관성 지원

-인스턴트 복구 수행



변경 이전 이미지 저장 및 실제 작업 수행

변경이 발생할 데이터에 대해 이전 이미지를 언두 블록에 저장한 후 실제 작업을 수행한다.



응답 수행

변경이 성공적으로 완료되었다면 서버 프로세스가 응답을 하게 됨

서버 프로세스가 전달받은 세션 정보를 이용하여 작업을 요청했던 유저 프로세스에게 결과발송

ex) '1 Row Updated' 메시지



커밋(Commit)에 따른 변화

 커밋이 수행되면 리두 로그 버퍼에 존재하는 변경에 대한 로그를 리두 로그 파일에 기록하게 됨  ― 빠른 커밋


**빠른 커밋 : 커밋을 수행하더라도 변경된 데이터 블록을 즉시 디스크로 저장하지는 않지만 해당 데이터 블록에 대한 조회는 메모리에서 수행하고 복구는 리두 로그 파일에 기록된 내용을 이용하기 때문에 마치 데이터베이스에 즉시 적용된 것과 같이 하겠다는 뜻


 실제 데이터 버퍼 캐쉬에 존재하는 변경된 데이터를 디스크에 저장하지는 않음 ― 지연 쓰기

→ 많은 양을 갱신하는 작업이나 적은 양을 갱신하는 작업이나 커밋하는 부분에서는 많은 시간 차이가 발생하지 않게 됨.


**지연 쓰기 : 변경된 데이터 블록이 일정량 모이면 한번에 디스크에 저장 




구문 분석 (Parsing)

검색 (Search)


하드 구문 분석 (Hard Parsing)

공유 풀에 해당 SQL에 대한 구문 분석이 존재하지 않는 경우. 구문 분석을 처음부터 수행


소프트 구문 분석 (Soft Parsing)

공유 풀에 SQL에 대한 구문 분석이 존재할 경우. 

구문 분석을 재수행하지 않고 기존 구문 분석을 이용하게 되므로 성능에서 유리


**동일 SQL로 인식하기 위해 만족해야 하는 조건

대·소문자 구별

띄어쓰기 구별

오브젝트에 대한 동일 소유자


**하드 구문 분석과 성능

과다한 하드 구문 분석은 데이터베이스 전체 성능 저하를 발생시킬 수 있다.

이 경우에는 공유 풀 대기 현상이 심해지게 된다. 이와 같은 현상이 발생한다면 앞에서 언급한대로 SQL 문장을 수정하여 소프트 구문 분석으로 수행할 수 있도록 변경해 주어야 한다.


**소프트 구문 분석

수행된 모든 SQL이 공유 풀에 무조건 존재하여 해당 SQL이 다시 수행될 수 있도록 모든 경우에 소프트 구문 분석을 수행하는 것은 아니다. 공유 풀은 메모리 영여긍로 제한된 크기를 가지고 있기 때문.

공유 풀은 LRU(Least Recently Used) 알고리즘을 사용하여 공유 풀 공간이 부족하면 최근에 가장 적게 사용한 SQL 및 해당 구문 분석을 삭제하여 여유 공간을 확보하게 됨.



문장 확인 (Syntax Check)

SQL문의 철자 및 문법 확인. 이상이 있으면 에러 발생.



데이터베이스 분석 (Database Resolution)

데이터베이스 분석은 Database Resolution 또는 Semantic Check라고 말함

데이터베이스 분석 단계는 실행된 SQL문을 수행하기 위한 필요 요소들이 존재하는 지를 확인하는 단계


-확인하는 필수요소-

대상 테이블의 존재 유무

대상 테이블에서 필요한 컬럼 존재 유무


이와 같은 항목을 확인하기 위해서는 시스템 테이블스페이스의 데이터 딕셔너리를 확인해야 함

TAB$ 데이터베이스에 존재하는 모든 테이블 목록

COL$ 데이터베이스에 존재하는 모든 테이블의 컬럼 목록


**기본 딕셔너리 테이블은 데이터 딕셔너리 뷰의 내용을 저장하는 실제 테이블을 의미

기본 딕셔너리 테이블은 다음과 같은 데이터 딕셔너리 뷰의기본 딕셔너리 테이블이 됨

TAB$ DBA_TABLES

COL$ DBA_TAB_COLUMNS



단순화 (Simple Transformation)

오라클 옵티마이저가 좀 더 좋은 실행 계획을 생성하기 위해 내부적으로 SQL을 변경


**옵티마이저

옵티마이저는 실행될 SQL을 어떤 방식으로 수행할지를 결정하여 실행 계획을 수립하는 일을 함

옵티마이저의 판단에 의해 해당 SQL의 성능이 좌우됨



권한 확인

권한 확인을 수행하기 위해서는 데이터베이스 분석 단계와 마찬가지로 시스템 테이블스페이스에 저장되어 있는 데이터 딕셔너리 뷰를 조회해야 함


DBA_SYS_PRIVS

DBA_TAB_PRIVS


데이터 딕셔너리 뷰를 조회한 후 공유 풀의 데이터 딕셔너리 캐쉬에 저장하여 확인하게 됨

해당 데이터 딕셔너리 뷰를 조회한 후 해당 유저가 수행한 SQL에 대해 권한이 존재하며 해당 SQL이 DML이라면 해당 테이블에 대해 TM락을 수행하게 된다.



락 (TM Lock)

해당 테이블에 대해 DML을 수행하는 동안 다른 유저에 의해 테이블 삭제 및 컬럼 추가 등의 테이블 형태를 변경하는 작업을 제한하기 위해서 수행



실행 계획 및 구문 분석 트리 (Parsing Tree) 생성

구문 분석의 결과물. 대상 SQL과 함께 공유 풀에 저장됨



시스템 뷰 (System View)


데이터 딕셔너리 뷰 (DBA_) : 시스템 테이블스페이스에 저장. 해당 데이터베이스에 존재하는 오브젝트 및 기타 정보에 대한 내용을 조회할 수 있는 뷰


**데이터 딕셔너리 뷰

데이터베이스 생성시 생성됨

데이터베이스 생성 절차 중 catalog.sql이라는 스크립트를 수행하는 단계가 존재. 이 스크립트를 수행하면 데이터 딕셔너리 뷰 생성


**뷰(View)

오라클의 오브젝트 중 하나

실제 저장 공간을 소유하지는 않으며 뷰 정의에 대한 내용만을 데이터 딕셔너리에 저장하게 됨

뷰는 테이블을 조회하는 SQL을 오라클 오브젝트로 생성하여 해당 뷰를 조회하면 뷰에 사용된 SQL이 수행되면서 대상 테이블을 자동으로 조회하게 한다.


구분

DBA_ 해당 데이터베이스에 존재하는 모든 내용 조회 가능

ALL_ 해당 유저에게 권한이 존재하는 모든 내용 조회 가능

USER_ 해당 유저가 소유자(Owner)로 되어 있는 모든 내용 조회 가능


종류

오브젝트 관련 데이터 딕셔너리 뷰

DBA_OBJECTS 해당 데이터베이스에 존재하는 모든 오브젝트 정보

DBA_SEGMENTS 해당 데이터베이스의 모든 오브젝트 중 세그먼트에 대한 정보

DBA_TABLES 해당 데이터베이스에 존재하는 모든 테이블 목록 및 테이블에 관련된 모든 정보

DBA_INDEXES 해당 데이터베이스에 존재하는 모든 인덱스 목록 및 인덱스에 관련된 모든 정보

DBA_TAB_PARTITIONS 해당 데이터베이스에 파티션 테이블이 존재한다면 해당 데이터 딕셔너리 뷰에서 조회 가능

DBA_TAB_SUBPARTITIONS 해당 데이터베이스에 존재하는 파티션 중 복합 파티션 테이블이 존재한다면 해당 데이터 딕셔너리 뷰에서 조회 가능

DBA_VIEWS 해당 데이터베이스에 존재하는 모든 뷰 목록 및 뷰에 관련된 모든 정보

DBA_TRIGGERS 해당 데이터베이스에 존재하는 모든 뷰 목록 및 뷰에 관련된 모든 정보

DBA_SYNONYMS 해당 데이터베이스에 존재하는 모든 동의어 목록 및 동의어에 관련된 모든 정보

DBA_ROLLBACK_SEGS 해당 데이터베이스에 존재하는 모든 언두 세그먼트의 정보 


**오브젝트와 세그먼트

오브젝트 중 스토리지 영역을 가지는 오브젝트를 세그먼트라 한다. 

예를 들어, 테이블과 인덱스는 오브젝트이면서 세그먼트이지만 뷰와 시퀀스 등은 스토리지 영역 없이 정의만 저되므로 단지 오브젝트에 해당된다.



유저 및 권한 관련 데이터 딕셔너리 뷰

DBA_USERS 데이터베이스에 존재하는 모든 유저에 대한 정보 조회

DBA_TS_QUOTAS 데이터베이스 유저별로 각 테이블스페이스에 할당된 공간을 확인

MAX_BYTES 컬럼이 -1의 값이라면 해당 테이블스페이스에 대해 공간 사용에 대한 제한이 없다는 것을 의미

DBA_TAB_PRIVS 유저 또는 롤 별로 테이블에 대한 권한 부여 현황을 확인

DBA_SYS_PRIVS 유저 또는 롤 별로 부여된 시스템 권한을 확인

DBA_ROLES 데이터베이스에 존재하는 모든 롤을 확인

DBA_ROLE_PRIVS 유저 및 롤에 할당된 롤을 확인


**롤 (Role)

유저의 권한 관리를 보다 편리하게 수행하기 위해 만들어진 개념



스토리지 관련 데이터 딕셔너리 뷰

DBA_TABLESPACES 데이터베이스에 존재하는 모든 테이블스페이스에 대해 조회

DBA_SEGMENTS 데이터베이스에 존재하는 오브젝트 중 스토리지를 가지는 모든 세그먼트를 조회

DBA_EXTENTS 각 세그먼트별로 할당된 익스텐트에 대해 조회

DBA_DATA_FILES 각각의 테이블스페이스를 구성하는 데이터 파일의 정보를 확인

DBA_TEMP_FILES 지역 관리 임시 테이블스페이스에 대한 임시 파일 정보를 확인할 수 있는 데이터 딕셔너리 뷰

DBA_FREE_SPACE 테이블스페이스별로 사용 가능 여유 공간을 확인할 수 있는 데이터 딕셔너리 뷰


기타 데이터 딕셔너리 뷰

DBA_TAB_COLS 테이블을 구성하는 모든 컬럼 정보를 확인

DBA_IND_COLUMNS 테이블에 생성되어 있는 인덱스들의 컬럼 구성 정보를 확인

DBA_PART_KEY_COLUMNS 파티션 테이블에 대해 파티션 키 컬럼을 확인



동적 성능 뷰 (V$) : 메모리 상태 및 현재 세션에 대한 정보를 확인할 수 있는 뷰


종류

세션 관련 동적 성능 뷰

V$TRANSACTION 현재 언두 데이터를 사용하는 모든 작업에 대해 실시간 조회

V$SESSION 현재 데이터베이스에서 작업을 수행하거나 또는 수행하지 않더라도 접속해있는 모든 세션 정보

V$PROCESS 데이터베이스에 접속한 운영체제 프로세스별로 하나의 로우씩 추출

V$SQL 해당 세션에서 수행된 SQL을 조회


대기 이벤트 관련 동적 성능 뷰

V$SESSION_WAIT 현재 세션에서 발생하고 있는 대기 이벤트를 확인

V$EVENT_NAME 해당 뷰는 동적 성능 뷰는 아니지만 동적 성능 뷰에서 발생하는 모든 이벤트에 대한 정보를 저장하고 있는 참조성 뷰

V$SESSION_EVENT 현재 데이터베이스에 접속해 있는 세션들의 대기 이벤트 값들에 대한 누적 값을 확인

V$SYSTEM_EVENT 오라클 데이터베이스 기동 이후 대기 이벤트에 대한 모든 누적 값을 확인할 수 있는 동적 성능 뷰

V$SESSION_WAIT_HISTORY 현재 접속해 있는 세션별로 가장 최근 10개의 대기 이벤트를 저장하는 동적 성능 뷰


기타 동적 성능 뷰

V$DATABASE 해당 데이터베이스의 기본 정보를 제공

V$INSTANCE 해당 데이터베이스의 인스턴트 정보를 제공

V$SGASTAT 해당 데이터베이스의 메모리 정보를 확인할 수 있는 동적 성능 뷰

V$BACKUP 해당 데이터베이스의 모든 데이터 파일에 대해 백업 여부를 확인

V$LOCK 현재 데이터베이스에 수행중인 모든 락(Lock) 정보를 확인


**V$BACKUP

V$BACKUP 동적 성능 뷰의 STATUS 컬럼의 값이 ACTIVE라면 현재 온라인 백업 수행중이며, NOT ACTIVE라면 현재 온라인 백업중이 아니라는 뜻이 된다. 또한 DATE 컬럼은 가장 최근 ACTIVE 상태였던 일자를 뜻하므로 결국 가장 최근에 온라인 백업을 수행한 시간이 된다.







참고자료 : 책 《초보자를 위한 오라클 10g》 (정보문화사)

그외 자료 출처 : 각 자료 하단에 출처 표기

인용 이미지 출처 : http://www.oraclecoursebooks.com/books/oracle9i_admin/04_9i_dba/04_oracle9iadmin.html



-블로거. 이세진

'Database' 카테고리의 다른 글

오라클 프로세스  (0) 2013.08.27
오라클 메모리  (0) 2013.08.27
오라클 설치  (0) 2013.08.26
데이터베이스  (0) 2013.08.26
Posted by DBA SJ
: