레이블이 Oracle학원인 게시물을 표시합니다. 모든 게시물 표시
레이블이 Oracle학원인 게시물을 표시합니다. 모든 게시물 표시

2013년 10월 3일 목요일

오라클 논리적 저장 공간, 오라클의 논리적 구성, 데이터베이스 구성,테이블,테이블스페이스,블로그 익스텐트

오라클 논리적 저장 공간, 오라클의 논리적 구성, 데이터베이스 구성,테이블,테이블스페이스,블로그 익스텐트


논리적 저장영역
1. Data Block
- Oracle에서 Data를 저장하는 가장 작은 단위, 블록단위로 DataBase의 DataFile에 있는 저장영역
을 관리한다.
- Data Block의 크기는 최대한계내에는 운영체제 블록크기의 배수여야 한다.
- 구성
  Head : 블록주소와 Segment유형(Data,Index,RollBack…)등의 일반적인 블록정보를 포함
Table Directory : 해당블록에 행을 가지는 Table에대한 정보를 가진다.
Row Directory : 블록내의 실제 행에 대한 정보를 가진다.
Row Data : Table Data Or Index Data를 포함한다.
빈영역
  트랜잭션 입력항목에 사용되는 영역 :  블록내의 하나이상의 행을 Access하는
                                      Insert/Update/Delete/Select등의 명령문은
                                      블록에 하나의 트랜잭션 입력항목을 필요로 한다.
                                      대부분의 운영체제에서는 약23 Byte정도를 필
                                      요로함


2. Extents
- 저장영역할당을 위한 논리적인 단위로 연속적인 몇 개의 Data Block으로 구성된다.
- 각 Segment는 적어도 하나이상의 Extents(RollBack Segment는 2개이상)를 자지고 생성됩니다.
이러한 확장을 initial extents라고 한다.
- 일반적으로 한 Segment의 확장영역은 drop table또는 drop cluster명령으로 개체를 삭제하여
TableSpace에 반환한다.
(예외)truncate … drop storage를 이용하여 Table이나 Cluster를 Truncate시킬수 있슴
    Oracle은 주기적으로 RollBack Segment에 있는 하나이상의 Extents를 해제할수
    있다.
    DBA는 alter table table_name deallocate unused명령을 이용하여 확장영역을 해제할
    수 있다.


3. Segment
- Extents(확장영역)의 집합
A. Data Segment
- DataBase의 SnapShot과SnapShot Log를 포함한 모든 Cluster화 되지 않은 Table은 자신의
Data를 저장하기위해 단일데이터세그먼트(Single Data Segment)를 가진다. Create
Table/SnapShot/SnapShot Log명령을 사용하여 Object를 생성할때 Data Segment를
생성하며 Create Cluster명령이 실행될때 Cluster 에 대한 Data Segment를 생성한다.

B. Index Segment
- Index생성시 Segment할당된다.(Create Index…)

C. RollBack Segment
- Transaction이 RollBack되어야할 경우 트랜잭션 작동을 기록
- 각 DataBase에는 하나이상의 RollBack Segment가 있슴
- Transaction별로 변경되기전의  Data를 기록
- Transaction을 Commit할때 RollBack Segment의 정보를 해체하지만 바로 없애지는 않는다.
Transaction을 Commit 하기전에 시작된 Query에 관련된 Data의 read-consistent  view(읽기
일관성 뷰)를 생성하지위해 data가 RollBack Segment에 남아 있다.
그러한 View를 생성할 가능성이 있는한 RollBack Data를 사용할 수 있도록 Oracle은
RollBack Segment의 확장영역을 순차적으로 사용한다.
RollBack Segment의 마지막 영역이 꽉차면 첫번째 Extents로 돌아가서 RollBack Data를 기록함.
또한 장기적으로 실행되는 Transaction은 RollBack Segment에 새로운 Extents(확장영역)를
요구할수도 있슴.

D. Temp Segment
- Create Index, Select Order By, Select Distinct, Select Group By, Select Union,
Select,Minus,Select ,Intersect등의 명령은 Temp Sefment를 필요로 한다.
예를들어 Query에 Distint,Group By,Order by등이 있으면 Oralce은 두개의 Temp
Segment를 요구할수도 있다. 명령이 완료되면 Oracle은 Temp Segment를 삭제한다.

- Oracle은 사용자 Session기간 동안 필요한만큼의 Temp Segment를 생성한다.
Create User나 Alter User등의 명령에 Temporary TableSpace다음의 TableSpace에 Temp
Segment를 생성한다. 사용자가 Temp Segment를 생성하지 않으면 Default System TableSpace임

예)create user scott identified by tiger default tablespace users temporary
tablespace temp;

오라클자바커뮤니티에서 설립한 개발자교육6년차 오엔제이프로그래밍 실무교육센터
(오라클SQL,튜닝,힌트,자바프레임워크,안드로이드,아이폰,닷넷 실무개발강의)  




2013년 8월 16일 금요일

오라클 Optimizer Mode Setting 방법

오라클 Optimizer Mode Setting 방법

대한민국오라클학원/오라클학원/오라클교육/오라클강의/구로 오라클/가산오라클/오라클강


--------------------------
1.        Instance 수준의 셋팅 방법
--------------------------


오라클자바커뮤니티에서 설립한  개발자중심! 오엔제이프로그래밍 실무교육센터
(신입사원채용무료교육, 오라클, SQL, 튜닝, 자바, 스프링, Ajax, jQuery, 안드로이드, 아이폰, 닷넷, C#, ASP.Net)   www.onjprogramming.co.kr 


-        DB의 설정 파일(initSID.ora or spfileSID.ora)에 전체적으로 적용이 되도록 정의하는 방법이며 다음과 같이 기술하며 OPTIMIZER MODE는 REUL, CHOOSE, ALL_ROOWS, FIRST_ROWS와 같은 종류가 있습니다. CHOOSE인 경우 한테이블이라도 Analyzed되어 있는 경우엔 비용기반 접근 방식을 이용하는 것이며 RULE인 경우 규칙기반 접근 방식을 사용, ALL_ROWS인 경우 비용기반 옵티마이저의 한 방법이며 모든 ROW들을 처리한다고 할 때 그 비용을 최소화 하는 방법으로 실행계획을 수립하며,  FIRST_ROWS인 경우엔 최초 ROW를 추출하는데 드는 비용을 최소화 하도록 실행 계획을 구성하는 것입니다.

-        예) OPTIMIZER_MODE=FIRST_ROWS

-        만약 initSID or spfileSID.ora에 아무 내용도 정의하지 않은 경우 기본적으로 CHOOSE 방식이 됩니다.

-------------------------
2.        Session 수준의 셋팅 방법
-------------------------

-        alter session이라는 명령을 이용하면 현재 접속된 세션 레벨에서 옵티마이저 모드를 정의할 수 있습니다.

-        예) alter session set optimizer_goal=rule 앞과 같이 정의하면 해당 세션이 끝나기 전까지는 규칙 기반(,RULE-BASED) 옵티마이저 모드를 이용하게 됩니다.

--------------------------
3.        Statement 수준의 셋팅 방법
--------------------------

-        힌트(Hint) 구문을 이용한다면 매 SQL 문장마다 서로 다른 옵티마이저 모드를 적용할 수 있습니다.

-        예) SELECT /*+ FIRST_ROWS */
                          ENAME,
                          SAL,
                          JOB
              FROM EMP
              WHERE SAL > (SELECT MAX(SAL)
                                    FROM  EMP
                                    WHERE DEPTNO = 10)

2013년 8월 5일 월요일

Struts의 ActionServlet

Struts의 ActionServlet


오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷 실무전문 강의) 



Struts의 ActionServlet은 javax.servlet.http.HttpServlet 클래스를 상속 받았으며 HTTP 요청을 스트럿츠의 적절한 핸들러에게 보내는 역할을 수행 합니다.

스트럿츠에서 클라이언트의 요청을 처리하는 초기 진입은 ActionServlet이 담당하고 있습니다. 모델 2에서는 UserServlet이나 또 다른 서블릿을 필요할 때마다 새로 작성할 필요가 있지만 스트럿츠에서는 ActionServlet 하나만을 이용하여 모든 요청을 처리하는 하는 것이 가능 합니다.

Struts1.1 이전 버전에서는 ActionServlet이 요청을 받아 핸들러를 호출하는 유일한 클래스 였지만 1.1 버전 이후 부터는 ora.apache.struts.action.RequestProcessor 라는 클래스가 추가되어 클라이언트의 요청을 처리 할 수 있게 되었습니다.

ActionServlet은 클라이언트의 요청을 받게 되면 URI를 사용하여 어떤 Action이 주어진 요청을 처리할 것인지를 결정 하는데 이때 struts-config.xml 파일에 설정된 Action 태그에 설정된 내용을 확인 합니다. URI는 Action 설정의 path 속성과 일치해야 합니다.

아래 struts-config.xml 파일의 내용을 참고 하세요~

<action         
            path="/LoginSubmit"
            type="login2.LoginAction"
            name="loginForm"                       
            validate="true"
            input="/login.jsp"
        />

만약 login.jsp에서 HTML의 <form> tag에 action=/LoginSubmit 이라고 한 후 submit 버튼을 누르게 되면 톰캣은 struts-config.xml의 action의 path와 일치함을 알고 login2.LoginAction 클래스를 실행시킴으로써 Action을 처리하게 되는 것 입니다.


ActionServlet은 주어진 입력 값 들을 한꺼번에 자바 빈즈로 묶을 수 있는데 이 자바 빈은 스트럿츠 ActionForm 클래스의 서브클래스로 구성 됩니다. 이를 폼빈(FormBean) 이라고 하며 struts-config.xml 파일에서 <form-bean> 이라는 태그에서 설정을 하게 됩니다.

아래는 struts-config.xmml 파일에서 설정 예 입니다.

<form-beans>
        <form-bean name="loginForm" type="login2.LoginForm">                 
            <form-property name="pwd" type="java.lang.String" />
            <form-property name="id" type="java.lang.String" />           
        </form-bean>           
    </form-beans>

이때 <action> 태그의 name과 <form-bean>의 name이 일치함을 잘 보시기 바랍니다.


다른 자바 서블릿과 마찬가지로 Struts의 ActionServlet 역시 웹 애플리케이션의 배치 스크립트(web.xml)에 정의를 해야 하는데 그 내용은 아래와 같습니다.

<!-- ActionServlet Congif ================================-->
        <servlet>
                <servlet-name>action</servlet-name>
                <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
                <init-param>
                        <param-name>config</param-name>
                        <param-value>/WEB-INF/struts-config.xml</param-value>
                </init-param>
                <load-on-startup>1</load-on-startup>               
        </servlet>
       
       
        <!-- ActionServlet Mapping ====================================-->
        <servlet-mapping>
                <servlet-name>action</servlet-name>
                <url-pattern>*.do</url-pattern>
        </servlet-mapping>

확장자가 .do 로 넘어오는 요청은 ActionServlet으로 서비스 함을 의미합니다. 

2013년 8월 4일 일요일

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

오라클 프로세스(Oracle Process)

Oracle 프로세스 구조는 다중 작업이 발생하는 방법과 다중 작업이 수행되는 방식을 정의 하므로 
매우 중요합니다. 
A.단일 프로세스 Oracle Instance :단일 사용자 Oracle은 하나의 프로세스가 모든 Oracle Code를 
실행하는 시스템입니다. Oracle의 일부분과 Client응용프로그램을 분리하여 실행하는데 다른 
프로세스를 
사용하지 않습니다.대신 Oracle의 모든 코드와 단일사용자의 데이터베이스 응용 프로그램은 단일 
프로세스에 의해 실행됩니다. 

B.다중 프로세스 Oracle Instance : 다중사용자 Oracle은 여러 개의 프로세스가 Oracle의 각기 
다른 부분을 실행하고 접속한 각사용자들은 개별 프로세스를 실행합니다. 

C.다중 사용자 환경에서의 Oracle 프로세스 
1. 데이터베이스 기록자(DBWR) 
  -  DataBase Buffer의 내용을 데이터 파일에 기록하는 역할을 하며 DataBase Buffer Cache를 
관리하는 Oracle BackGround 프로세스임 
  -  DataBase Buffer Cache에 있는 내용이 수정되면 해당 버퍼는 'Dirty'로 표시되는데 이 
Dirty Buffer를 Disk에 기록하여 Buffer Cache를 깨끗한 상태로 유지하는 역할을 함 
  -  LRU 알고리즘에 의해 최근에 사용된 데이터블록을 메모리에 유지합니다. 
  -  Buffer Cache는 Multi Latch를 자지는데 래치는 공유 데이터구조를 보호하는 자동내부 
잠금입니다. DB_BLOCK_LRU_LATCHES라는 Parameter는 시스템에 구성되는 래치수 
    와 기본적으로 CPU에 설정되는 Latch 수를 제어합니다. 
  -  서버프로세스가 Buffer를 Dirty목록으로 이동시킨후 Dirty목록이 임계길이에 도달했음을 
발견하면 Server 프로세스는 DBWR에 신호를 보냅니다. 
  -  체크포인트가 발생하면 LGWR(로그기록자)는 DBWR에 신호를 보냅니다. 즉 Check Point가 
발생하면 LGWR는 디스크에 기록되어야 하는 수정된 Buffer 목록을 
    지정합니다. DBWR는 디스크에 지정된 Buffer의 내용을 기록합니다. 

2.  로그기록자(LGWR) 
- Redo Log Buffer를 디스크에 있는 Redo Log File에 등록합니다. 
- 사용자 프로세스가 Transaction을 Commit할때의 Commit Record및 매3초 마다의 Redo Log 
 buffer, DBWR가 수정된 버퍼를 디스크에 기록할때의 Redo Buffer의 내용등을 기록합니다. 

- 사용자가 Commit명령을 발생시키면 LGWR는 Commit Record를 즉시 Redo Log Buffer에 넣지만 
해당 데이터 버퍼의 변경은 변경사항을 데이터 파일에 기록하는 것이 
  더 효율적일때까지 지연됩니다. 

3 체크포인트(CKPT) 
- Check Point가 발생하면 Oracle은 모든 DataFile의 Header를 갱신하여 체크포인트임을 
나타내야 합니다. 보통 LGWR가 이러한 작업을 수행하지만 체크포인트가 시스템 Performance를 
저하 시킨다면 CKPT를 활성화하여 체크포인트 수행작업을 LGWR가 수행하는 다른 작업과 분리할 
수 있습니다. 
-  체크포인트가 모든 응용프로그램에 꼭 필요한 것은 아니며 DataFile의 수가 많아 Check 
Point중에 LGWR프로세스 성능이 저하되면 CKPT프로세스를 활성화 할수있다. 
- 초기화 Parameter CHECK_POINT_PROCESS는 CKPT프로세스를 활성화 하거나 비활성화 합니다. 

4. 시스템모니터(SMON) 
- 인스턴스 시작시에 인스턴스의 복구를 수행, 더 이상 사용하지 않는 임시 Segment를 삭제하며 
사용 가능한 빈영역을 더 큰 블록으로 만들기위해 인법한 빈 확장영역을 하나로 통합합니다. 

5. 프로세스모니터(PMON) 
- 사용자 프로세스에 장애가 발생하면 프로세스 복구를 수행,Cache를 비우고 해당 프로세스가 
사용한 자원을 해제하며,활성 Transaction의 Table상태를 재설정하고 Lock을 해제하며 Active 
Process목록에서 ID를 제거한다. 
- 주기적으로 Dispatch와 서버 프로세스의 상태를 점검하고 활동중이 아니면 재시작합니다.  
  
6. 복구자(RECO) 
- 분산 Transaction을 포함한 장애를 자동으로 해결하는 분산 Option과 함께 사용되는 프로세스, 
시스템이 분산 트랜잭션을 허용하고 DISTRIBUTED_TRANSACTIONS가 0보다 클때만 존재합니다. 

7. 아카이브(ARCH) 
- Online Redo Log File이 꽉차면 이를 지정된 저장장소에 저장,Redo Log가 Archive Mode에서 
운영되고 자동 Archiving기능이 활성화 되어 있을 때만 존재합니다. 

8. 잠금(LcKn) 
- 병렬서버 옵션에서 최대 10개 까지의 잠금Process(LCK0~LCK10)가 인스텀스의 Lock을 제공합니다. 
그러나 대부분의 병렬서버 시스템에서는 하나의 LCK프로세스(LCK0)만 
  으로도 충분합니다. 

9. 스냅샷갱신(SNPn) 
- 분산 옵션에서 최대 10갸 까지의 스냅샷갱신프로세스(SNP0~SNP10)가 자동으로 Table SnapShot을 
화면에 다시 표시합니다. 

10. 디스패쳐(Dnnn) 
- 디스패쳐 프로세스를 사용하면 사용자 프로세스는 제한된 수의 서버 프로세스를 공유할 수 
있습니다. 디스패쳐가 없다면 각 사용자 프로세스는 하나의 전용(Dedicated)서 
  버 프로세스를 필요로 합니다. 그러나 Multi Thread Server에서는 동일한 수의 사용자에 
대해 더 적은 수의 공유서버 프로세스를 필요로 합니다. 
- 단일 DataBase Instance에 대해 다중 Dispatcher 프로세스를 생성할 수 있습니다. Oracle을 
사용하는 시스템의 Network Protocol에 대해 적어도 하나의 디스페처가 생성되어야 합니다. DBA는 
프로세스당 접속수에 대한 OS의 한계에 따라 가장 적합한수의 디스패처를 시작해야 하며 
인스턴스가 실행되는 동안 디스패처 프로세스를 추가또는 삭제할수 있다. 

- 인스턴스가 시작되면 Listener는 사용자를 Oracle과 접속시키는 통신경로를 설정하며, 
각 디스패처는 리스너에 접속 요구사항을 수신할 수 있는 주소를 부여합니다. 
사용자 프로세스가 접속을 요구하면 리스너는 요구사항을 점검하고 사용자가 디스패처를 사용할 수 
있을지에 대해 결정합니다. 사용할 수 있을 경우 리스너는 로드할 양이 가장적은 디스패처 주소를 
돌려주며 사용자 프로세스는 디스패처에 직접 접속됩니다. 


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

2013년 8월 2일 금요일

[Oracle Hint]조인 방법 변경(USE_MERGE) , 오라클힌트강좌

조인 방법 변경(USE_MERGE)

구로디지털 오엔제이프로그래밍실무교육센터
www.onjprogramming.co.kr


머지 조인(Merge Join)이 일어나도록 유도하는 힌트 구문으로 이 경우 거의 SORT를 동반하므로 SORT MERGE JOIN이라고 부릅니다. 머지 조인이란 양쪽 테이블에서 대상 로우를 추출 후 조인 컬럼을 기준으로 SORT를 한 후 최종 결과를 만들어 내는 조인 방식 입니다.

USE_NL처럼 FROM 절 다음에 위치하는 테이블의 순서는 중요하지 않은데 그 이유는 어차피 독립적으로 정렬된 후 병합이 일어나므로 중요하지 않다고 할 수 있으며 SORT MERGE JOIN에서는 드라이빙 테이블의 의미가 없습니다.

[형식]
/*+ USE_MERGE ( table [table]... ) */


[예]
아래 예제는 Oracle 10g에서 돌렸습니다.


select /*+ ORDERED USE_MERGE(e) */
      e.empno,
  e.ename,
  d.dname,
  d.loc
from  dept d, emp e
where  e.deptno = d.deptno

---------------------------------------------------------------
Operation Object Name Rows Bytes Cost
-------------------------------------------------------------
SELECT STATEMENT Optimizer Mode=ALL_ROWS 14  5
  MERGE JOIN 14  406  5                   
    TABLE ACCESS BY INDEX ROWID SCOTT.DEPT 4  72  2 
      INDEX FULL SCAN SCOTT.PK_DEPT 4  1 
    SORT JOIN 14  154  3                   
      TABLE ACCESS BY INDEX ROWID SCOTT.EMP 14  154  2 
        INDEX FULL SCAN SCOTT.IDX_EMP_DEPTNO 13  1                   

select /*+ USE_MERGE(d e) */
      e.empno,
  e.ename,
  d.dname,
  d.loc
from  dept d, emp e
where  e.deptno = d.deptno

---------------------------------------------------------------------
Operation Object Name Rows Bytes Cost
------------------------------------------------------------------
SELECT STATEMENT Optimizer Mode=ALL_ROWS 14  5
  MERGE JOIN 14  406  5                   
    TABLE ACCESS BY INDEX ROWID SCOTT.DEPT 4  72  2 
      INDEX FULL SCAN SCOTT.PK_DEPT 4  1      SORT JOIN 14  154  3                   
      TABLE ACCESS BY INDEX ROWID SCOTT.EMP 14  154  2 
        INDEX FULL SCAN SCOTT.IDX_EMP_DEPTNO 13  1                   

[실습]

- 실습을 위한 예제 테이블 및 데이터는 아래 링크에서 확인 바랍니다.
http://www.onjprogramming.co.kr/oraclejavanew/oraclejava/bbs/board.php?bo_table=LecOrccleTun&wr_id=53&page=0&sca=&sfl=&stx=&sst=&sod=&spt=0&page=0

myemp1 : 1000만건
myemp1_old : 100만건
mydept : 5건

테스트환경 : oracle 11g

 
MYEMP1이 비드라이빙 테이블이지만 머지조인 에서는 별 의미 없다.

SQL> select /*+ ORDERED USE_MERGE(e) */
  2        e.ename,
  3        d.dname
  4  from  mydept1 d, myemp1 e
  5  where  e.deptno = d.deptno  ;

20000000 개의 행이 선택되었습니다.

경  과: 00:02:22.62


---------------------------------------------------------------------------------------
| Id  | Operation          | Name    | Rows  | Bytes |TempSpc| Cost (%CPU)| Time    |
---------------------------------------------------------------------------------------
|  0 | SELECT STATEMENT    |        |    20M|  476M|      | 68516  (2)| 00:13:43 |
|  1 |  MERGE JOIN        |        |    20M|  476M|      | 68516  (2)| 00:13:43 |
|  2 |  SORT JOIN        |        |    10 |  100 |      |    4  (25)| 00:00:01 |
|  3 |    TABLE ACCESS FULL| MYDEPT1 |    10 |  100 |      |    3  (0)| 00:00:01 |
|*  4 |  SORT JOIN        |        |    10M|  143M|  459M| 68463  (1)| 00:13:42 |
|  5 |    TABLE ACCESS FULL| MYEMP1  |    10M|  143M|      | 16941  (1)| 00:03:24 |


SQL> select /*+ ORDERED USE_MERGE(d) */
  2        e.ename,
  3        d.dname
  4  from  myemp1 e, mydept1 d
  5  where  e.deptno = d.deptno ;

20000000 개의 행이 선택되었습니다.

경  과: 00:02:09.58

---------------------------------------------------------------------------------------
| Id  | Operation          | Name    | Rows  | Bytes |TempSpc| Cost (%CPU)| Time    |
---------------------------------------------------------------------------------------
|  0 | SELECT STATEMENT    |        |    20M|  476M|      | 68516  (2)| 00:13:43 |
|  1 |  MERGE JOIN        |        |    20M|  476M|      | 68516  (2)| 00:13:43 |
|  2 |  SORT JOIN        |        |    10M|  143M|  459M| 68463  (1)| 00:13:42 |
|  3 |    TABLE ACCESS FULL| MYEMP1  |    10M|  143M|      | 16941  (1)| 00:03:24 |
|*  4 |  SORT JOIN        |        |    10 |  100 |      |    4  (25)| 00:00:01 |
|  5 |    TABLE ACCESS FULL| MYDEPT1 |    10 |  100 |      |    3  (0)| 00:00:01 |
--------------------------------------------------------------------------------------- 

2013년 8월 1일 목요일

자바의 특성(객체지향적) , ORACLE JAVA OOP 실무강좌

******** 자바의 특성(객체지향적) ************

추상화(Abstraction) : 실제 사물을 명사화/동사화 시켜서 프로그램에 적용할수 있는 형태로 만드는 것
상속성(Inheritance) : 미리 만들어진 소스를 가지고 공유하며 재사용하고, 또한 특별한 부분에 대 해서는 다시 재정의해서 사용하는 것 자바에서 상속은 한 클래스를 확장하여 새로운 클래스를 만드는 것을 말한다. 이렇게 새로 만들어지는 클래스를 하위클래스(subclass)라고 부른다. 그리고 원래의 클래스는 상위클래스(superclass)라고 부른다.
다형성(Polymorphism) : 상속을 받은 것을 그대로 사용하지 않고 입맛에 맞게 바꾸어 줄 수 있도록 하는것이며 이 때문에 다형성 함수는 전달하는 변수의 타입을 고려하지 않게된다.
캡슐화(Encapsulation) : 캡슐화는 사용자로부터 객체 내부의 데이터를 감추는 것이다. 데이터를 변수로 나타내며, 클래스의 함수와 프로시저는 메소드(Method)라고 한다. 클래스가 다른 클래스의 데이터를 다루려면 메소드를 통해야 한다. 이러한 캡슐화는 객체 내부의 처리과정을 알 필요없이 그것을 다루는 메소드에 대해서만 알면 된다는 점에서 편리하다. 변수들(외부에서 임의로 조작되었을때 원하지 않는 결과가 나오는것들 또는 잘못된 결과가 나오는것들) 에대해서 외부로 부터 접근제한을 시키는 것이 바로 encapsulation, 즉 객체내부의 데이터와 메소드 항목을 정의할때 private로 지정하여 클래스 외부에서의 접근을 제한하는것.


다중 쓰레드를 지원한다.
- 프로세스는 실행중인 프로그램을 뜻하는 말입니다. 보통 프로세스가 운영 체제의
여 러 자원을 사용하는 기본 단의 입니다.
- 쓰레드(Thread)란 프로세스 내부에서 실행되는 일련의 명령 흐름을 뜻합니다.
프로세스내의 제어의 단일 순차 흐름을 의미하며, 때때로 수행 문맥
(execution context)또는 가벼운 프로세스(lightweight peocess)라함
- 프로세스가 실행되면서 하나의 흐름만을 갖는 것이 아니라 여러 개의 흐름으로
분기할 수 있으며 하나의 프로세스가 같은 시간에 여러 가지 일을 수행하기
위해서 여러 개의 스레드를 만들게 됩니다.
- 다중 쓰레드란 하나의 프로그램내에서 동시에 수행되며 서로 다른 작업들을
수행하는 복수개의 쓰레드들을 의미한다.


[예제]
class Employee {
String name;
String id;

//생성자
public Employee(String name1, String id1) {
name = name1;
id = id1;
}
public void gotoOffice() {
System.out.println(name+"님 출근하였습니다...");
}
public void gotoHome() {
System.out.println(name+"님 퇴근하였습니다...");
}
}


class Manager extends Employee {
String chargeDept;
public Manager(String newName,String newID,String newDept) {
//super는 상위클래스의 생성자를 의미
super(newName, newID);
this.chargeDept = newDept;
}

public void startJob() {
System.out.println(this.chargeDept +” “+ super.name + "님이 직원관리를 시작합니다...");
}
}


class Example {
public static void main(String args[]) {
Manager m = new Manager("이종철","12345","솔루션개발부");
m.gotoOffice();
m.startJob();
m.gotoHome();
Manager m1 = new Manager("홍길동","12346","고객관리부");
m1.gotoOffice();
m1.startJob();
m1.gotoHome();
}
}

2013년 7월 28일 일요일

[오엔제이프로그래밍,오라클,SQL,튜닝 실무교육,오라클마스터과정]오라클 프로세스(Oracle Process)란

Oracle 프로세스 구조는 다중 작업이 발생하는 방법과 다중 작업이 수행되는 방식을 정의 하므로 매우 중요합니다. 


오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷  실무전문 강의)



A.단일 프로세스 Oracle Instance :단일 사용자 Oracle은 하나의 프로세스가 모든 Oracle Code를
실행하는 시스템입니다. Oracle의 일부분과 Client응용프로그램을 분리하여 실행하는데 다른
프로세스를
사용하지 않습니다.대신 Oracle의 모든 코드와 단일사용자의 데이터베이스 응용 프로그램은 단일
프로세스에 의해 실행됩니다.

B.다중 프로세스 Oracle Instance : 다중사용자 Oracle은 여러 개의 프로세스가 Oracle의 각기
다른 부분을 실행하고 접속한 각사용자들은 개별 프로세스를 실행합니다.

C.다중 사용자 환경에서의 Oracle 프로세스
1. 데이터베이스 기록자(DBWR)
  -  DataBase Buffer의 내용을 데이터 파일에 기록하는 역할을 하며 DataBase Buffer Cache를
관리하는 Oracle BackGround 프로세스임
  -  DataBase Buffer Cache에 있는 내용이 수정되면 해당 버퍼는 'Dirty'로 표시되는데 이
Dirty Buffer를 Disk에 기록하여 Buffer Cache를 깨끗한 상태로 유지하는 역할을 함
  -  LRU 알고리즘에 의해 최근에 사용된 데이터블록을 메모리에 유지합니다.
  -  Buffer Cache는 Multi Latch를 자지는데 래치는 공유 데이터구조를 보호하는 자동내부
잠금입니다. DB_BLOCK_LRU_LATCHES라는 Parameter는 시스템에 구성되는 래치수
    와 기본적으로 CPU에 설정되는 Latch 수를 제어합니다.
  -  서버프로세스가 Buffer를 Dirty목록으로 이동시킨후 Dirty목록이 임계길이에 도달했음을
발견하면 Server 프로세스는 DBWR에 신호를 보냅니다.
  -  체크포인트가 발생하면 LGWR(로그기록자)는 DBWR에 신호를 보냅니다. 즉 Check Point가
발생하면 LGWR는 디스크에 기록되어야 하는 수정된 Buffer 목록을
    지정합니다. DBWR는 디스크에 지정된 Buffer의 내용을 기록합니다.

2.  로그기록자(LGWR)
- Redo Log Buffer를 디스크에 있는 Redo Log File에 등록합니다.
- 사용자 프로세스가 Transaction을 Commit할때의 Commit Record및 매3초 마다의 Redo Log
 buffer, DBWR가 수정된 버퍼를 디스크에 기록할때의 Redo Buffer의 내용등을 기록합니다.

- 사용자가 Commit명령을 발생시키면 LGWR는 Commit Record를 즉시 Redo Log Buffer에 넣지만
해당 데이터 버퍼의 변경은 변경사항을 데이터 파일에 기록하는 것이
  더 효율적일때까지 지연됩니다.

3 체크포인트(CKPT)
- Check Point가 발생하면 Oracle은 모든 DataFile의 Header를 갱신하여 체크포인트임을
나타내야 합니다. 보통 LGWR가 이러한 작업을 수행하지만 체크포인트가 시스템 Performance를
저하 시킨다면 CKPT를 활성화하여 체크포인트 수행작업을 LGWR가 수행하는 다른 작업과 분리할
수 있습니다.
-  체크포인트가 모든 응용프로그램에 꼭 필요한 것은 아니며 DataFile의 수가 많아 Check
Point중에 LGWR프로세스 성능이 저하되면 CKPT프로세스를 활성화 할수있다.
- 초기화 Parameter CHECK_POINT_PROCESS는 CKPT프로세스를 활성화 하거나 비활성화 합니다.

4. 시스템모니터(SMON)
- 인스턴스 시작시에 인스턴스의 복구를 수행, 더 이상 사용하지 않는 임시 Segment를 삭제하며
사용 가능한 빈영역을 더 큰 블록으로 만들기위해 인법한 빈 확장영역을 하나로 통합합니다.

5. 프로세스모니터(PMON)
- 사용자 프로세스에 장애가 발생하면 프로세스 복구를 수행,Cache를 비우고 해당 프로세스가
사용한 자원을 해제하며,활성 Transaction의 Table상태를 재설정하고 Lock을 해제하며 Active
Process목록에서 ID를 제거한다.
- 주기적으로 Dispatch와 서버 프로세스의 상태를 점검하고 활동중이 아니면 재시작합니다. 
 
6. 복구자(RECO)
- 분산 Transaction을 포함한 장애를 자동으로 해결하는 분산 Option과 함께 사용되는 프로세스,
시스템이 분산 트랜잭션을 허용하고 DISTRIBUTED_TRANSACTIONS가 0보다 클때만 존재합니다.

7. 아카이브(ARCH)
- Online Redo Log File이 꽉차면 이를 지정된 저장장소에 저장,Redo Log가 Archive Mode에서
운영되고 자동 Archiving기능이 활성화 되어 있을 때만 존재합니다.

8. 잠금(LcKn)
- 병렬서버 옵션에서 최대 10개 까지의 잠금Process(LCK0~LCK10)가 인스텀스의 Lock을 제공합니다.
그러나 대부분의 병렬서버 시스템에서는 하나의 LCK프로세스(LCK0)만
  으로도 충분합니다.

9. 스냅샷갱신(SNPn)
- 분산 옵션에서 최대 10갸 까지의 스냅샷갱신프로세스(SNP0~SNP10)가 자동으로 Table SnapShot을
화면에 다시 표시합니다.

10. 디스패쳐(Dnnn)
- 디스패쳐 프로세스를 사용하면 사용자 프로세스는 제한된 수의 서버 프로세스를 공유할 수
있습니다. 디스패쳐가 없다면 각 사용자 프로세스는 하나의 전용(Dedicated)서
  버 프로세스를 필요로 합니다. 그러나 Multi Thread Server에서는 동일한 수의 사용자에
대해 더 적은 수의 공유서버 프로세스를 필요로 합니다.
- 단일 DataBase Instance에 대해 다중 Dispatcher 프로세스를 생성할 수 있습니다. Oracle을
사용하는 시스템의 Network Protocol에 대해 적어도 하나의 디스페처가 생성되어야 합니다. DBA는
프로세스당 접속수에 대한 OS의 한계에 따라 가장 적합한수의 디스패처를 시작해야 하며
인스턴스가 실행되는 동안 디스패처 프로세스를 추가또는 삭제할수 있다.

- 인스턴스가 시작되면 Listener는 사용자를 Oracle과 접속시키는 통신경로를 설정하며,
각 디스패처는 리스너에 접속 요구사항을 수신할 수 있는 주소를 부여합니다.
사용자 프로세스가 접속을 요구하면 리스너는 요구사항을 점검하고 사용자가 디스패처를 사용할 수
있을지에 대해 결정합니다. 사용할 수 있을 경우 리스너는 로드할 양이 가장적은 디스패처 주소를
돌려주며 사용자 프로세스는 디스패처에 직접 접속됩니다.