레이블이 oracle pga인 게시물을 표시합니다. 모든 게시물 표시
레이블이 oracle pga인 게시물을 표시합니다. 모든 게시물 표시

2013년 8월 4일 일요일

Oracle View...(오라클 뷰)

A. . 정의
- View는 하나 이상의 Table또는 다른 View에 포함된 데이터를 원하는대로 나타낸 것
- View는 내장질의또는 가상 Table등으로 표현할수 있다.
- View는 Table에서 파생되므로 둘사이에는 많은 유사성이 있다. 예를들어 Table과 같이 최대
254개의 Column이 있는 View를 정의할수 있고 뷰를 질의하고 몇가지 제한 사항을 사용하여 뷰를
갱신,삽입,삭제를 할수있다.  뷰에대해 수행되는 모든 작업은 뷰의 기본 Table에 있는 Data에
실제 영향을 주며 기본 Table의 무결성 제약조건과 트리거를 따른다.
- 뷰에는 저장영역이 할당되지 않으며 실제로 Data를 포함하지도 않는다.
B. 처리방법
- Oracle은 View를 정의하는 질의 Text를 Data Dictionary(user_views)에 저장한다,
- Oracle은 기존공유 SQL영역에 동일한 멸령이 들어있지 않을때만 새로운 공유 SQL영역에 뷰를
참조하는 명령문을 Parsing합니다. 따라서 뷰를 사용시 공유 SQL영역과 관련하여 메모리 사용이
감소하는 이익이 있다.
- Oracle은 원래 질의를 뷰정의 질의와 병합할 때 원래 뷰를 변형하여 뷰에 대한 질의에 인덱스를
사용할지를 결정한다.

Create view emp_view as
    Select emp_no, ename, sal, loc
    From emp
    Where emp.deptno = dept.deptno
    And dept.deptno = 10;

<사용자 Query>
select ename from emp_view
where empno = 9876;


select ename
from emp, dept
where emp.deptno = dept.deptno
and  dept.deptno = 10
and  emp.empno = 9876;

Oracle은 가능한 모든 경우에 뷰에대한 질의를 뷰정의 질의 및 기본뷰 질의와 병합한다. 또한 뷰를
참조하지않고 질의를 발생하는 것 처럼 병합된 질의를 최적화한다.
따라서 Column이 뷰 정의 또는 뷰에대한 사용자정의에서 참조되는지의 여부에 관계없이 모든 참조된
기본 Table의 Column에 대한 Index를 사용한다.
만약 뷰에대한 정의와 사용자 질의를 병합할수 없다면 Index를 사용하지 않을수 있다.

C. 갱신가능한 Join View
- Join View란 From절에 하나이상의 Table또는 View를 가지며, Distinct, group by, start with,
connect by, rownum, union all, intersect, for update등의 절에서는 사용하지 않는다.

- 갱신가능한 Join View는 둘이상의 기본 Table 및 View를 포함하며 Update/Insert/Delete등의
작업이 가능하다.

- Dictionary View인 all_updatable_columns,윰_updatable_columns, user_updatable_colums
에는 갱신가능한 View의 Column을 나타낸다.

- Join View에 대한 Insert/Update/Delete등의 작업은 한번에 하나의 기본 Table에서만 가능하며,
With Check Option을 사용하여 View를 정의하는 경우에는 반복된 Table의 모든 Join Column과 모
든 Column은 갱신할수 없으며, Insert명령문은 허용되지 않는다.또한 with Check Option을
사용하여 뷰를 정의하고 키예약 Table이 반복되는 경우에는 뷰에서 행을 삭제할수 없다.

D. View생성
 - Create View명령을 사용한다.
예] create view sales_staff as
      select empno, ename, deptno
      from emp
      where deptno =10
      with check option constraint sales_staff_cnst;

    위에서 check option은 뷰가 선택할수 없는 행에 대해서는 Insert와 Update명령문이
    실행되지 않는다는 제약 조건을 갖는다.
    만약 위의 View에 deptno가 30인 행을 Insert하려고 하면 RollBack되고 오류가 발
    생한다.
E. View수정하기
위에서 만든 staff View를 재정의 하는경우
create or replace view sales_staff_view as
      select empno, ename, deptno
      from emp
      where deptno =30
      with check option constraint sales_staff_cnst;
F. View의 삭제
 - drop view sales_staff_view; 

[출처] 오라클자바커뮤니티, 오엔제이프로그래밍

(오라클테이블)Oracle Table...

a. Oracle에서 Table은 Data저장 영역의 기본단위이다.
b. 선택적으로 Table의 각 Column에 규칙을 정할수 있는데 이를 Constraints(무결성제약조건)
이라고 한다.한예로 Not Null은 무결성제약조건 입니다.
c. Cluster화되지 않은 Table을 작성할때 Oracle은 Table의 향후 Data를 보관하기위해
TableSpace에 Data Segment를 자동으로 할당한다.
Data Segment에 대한 저장영역 매개변수를 설정하여 (initial, next parameter등) Data
Segment에 대한 할당된영역(extents)을 제어할수 있다.
Data Segment에 대해 pctfree와 pctused를 이용하여 Data Block의 빈영역에 대해 제어할
수도 있다.
d. 전체행을 단일 Data Block에 Insert할수 있다면 Oracle은 행을 하나의 행조각으로 저장하
나 전체행을 단일 Data Block에 Insert할수 없다면 기존 행을 갱신하여 행이 Data Block의 크기를
증가시키는 경우(Update된 Record가 이전의 Record보다 Size가 커지는 경우) Oracle은 여러 개의
행조각을 사용하여 Data를 저장한다. Oracle이 하나의 행을 두개이상의 행조각으로 저장하는 경우
Block을 통해 Chain화 되며, 체인화된 행조각은 부분의 RowID를 이용하여 서로 체인화 된다. 또한
체인화에 관계없이 각각의 행조각은 행/열 전체또는 일부에 대한 행 헤더 및 Data를 포함한다.

e. 행 헤더는 행조각,(체인화된 행조각의 경우)체인화, 행조각의 열,(Cluster인경우)클러스터
키등을 포함한다.
하나의 Block에 완전히 포함된 Cluster화 되지않은 행에는 적어도 3 Byte의 행헤더가 있으며,
행헤더 정보 다음에 열길이와 Data가 포함된다. 열 길이는 250 Byte이하를 저장하는 열의 경우
1 Byte,그이상인경우 3 Byte가 필요하며 열 Data에 선행한다.
열 Data에 필요한 영역은 Data Type에 따라 틀리며, 가변길이인 경우엔 영역은 증가또는 감소할수
있다.영역을 보존하기 위해 Null은 열길이(0)만을 저장한다. Oracle은 Null Column에 대한
Data를 저장하지 않으며 후행하는 Null의 경우 행헤더가 새로운 행의 시작을 나타내므로 열길이를
저장하지 않는다.(예를들어 Table의 마지막세개의 Column이 Null인 경우 열에 정보를 저장하지
않는다.)
또한 각각의 행은 Data Block헤더의 행 Directory에 2 Byte를 사용한다.

f. Column순서는 Table의 모든 행에 대해 동일 하다.일반적으로 열은 Create Table명령문에
나열된 순서대로 저장되지만 꼭 그렇지는 않다. 예를들어 Long Data Type의 Column이 
있는 Table을 Create하는 경우 항상 이 Column을 마지막으로 저장한다. 또한 alter table
등의 명령으로 Column을 Add하는 경우 새로운 Column을 마지막에 추가한다.
일반적으로 행이 적은 영역을 차지하도록 Null을 자주 포함하는 Column을 마지막에 두
는 것이 좋다 만약 Table이 Long Column을 포함하면 Long Column이 마지막에 위치 하
므로 이러한 이점을 살리기 힘들다.
g. ROWID는 각각의 행조각을 위치나 주소로 식별한다. 일단 행조각에 ROWID를 부여 하
면 행조각은 IMPORT 및 EXPORT Utility를 사용하여 행을 삭제할 때까지 ROWID를 보유 합니다.
행의 Cluster Key값이 변경되면 행은 유일한 ROWID를 유지하면서 새로운 값에 대한 추가
포인터 ROWID를 얻는다.

h. Null은 행의 열에 값이 없음을 나타내는데 Data값을 가진 열사이에 위치하는 경우 Null
 은 열길이(0)을 저장하는데 1 Byte가 필요함

[Table생성 예제]
create table test
(
 id  char(3)      not null,
 name varchar2(12)    null,
 addr varchar2(50)    null,
 constraint pk_test (id) primary key
 using index
 pctfree 10
 pctused 60
 storage
 (initial 100k next 100k)
 tablespace users_idx
)
storage
(initial 200k
next    200k
minextents 1
maxextents 121
pctincrease 0)
tablespace users;

oracle pga(Oracle Program Global Area)

PGA(프로그램 글로벌영역,프로세스 글로벌영역) 
- 단일 프로세스(서버,백그라운드)에 대한 데이터와 제저정보를 저장하는 메모리 영역 
- 사용자 프로세스가 접속되고 세션이 형성되면 Oracle이 PGA를 할당한다. 
- 각 서버프로세스에 하나의 PGA가 할당되며,PGA는 서버프로세스에 대해 배타적이며 
항상 프로세스에 대해 실행되는 Oracle Code만을 읽거나 쓸수있슴 
- PGA의 크기는 운영체제마다 정적이며, OPEN_LINKS,DB_FILES,LOG_FILES등의  
  Parameter는 PGA의 크기에 영향을 준다. 사용자가 일단 접속되면 사용자는 PGA영 
  역을 초과하여 실행할수 없슴. 

1. 스택영역 
- PGA는 세션변수,배열 및 다른 정보를 저장하기위해 할당된 메모리인 스택 영역을 포 
함 

2. 세션정보 
- 다중스레드 서버없이 실행되는 인스턴스의 PGA는 전용SQL영역이나 다른 정보와 같 
은 사용자 세션에 대한 추가 메모리가 필요하고 인스턴스가 다중스레드 서버를 실행하 
는 경우 이추가 메모리는 PGA에 있지 않고 SGA내에 할당된다. 

3. 공유SQL영역 
- 다중스레드 서버와 함께 수행되는지의 여부에 관계없이 공유 SQL영역은 항상 PGA가 
아닌 SGA의 공유 메모리에 존재합니다.

[출처]오라클자바커뮤니티, 오엔제이프로그래밍
www.onjprogramming.co.kr