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

2013년 8월 27일 화요일

자바의 자료형 소개 [오라클교육오라클자바교육강의강좌,자바교육,ORACLEJAVA교육강의강좌]

자료형에 대해 계속 보도록 하겠습니다.


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



1. 정수 자료형 (byte,short,int,long)

자바에서 제공하는 정수 자료형은 byte, short, int, long 4가지가 있습니다.(1,2,4,8 바이트 순)

C언어의 unsigned는 지원하지 않습니다.

short, byte에 연산을 하면 무조건 int형이 됩니다. 아래의 예를 보죠...

short a=0, b=0;

short c = a + b;

만약 위의 코드 부분이 컴파일 되다면 다음과 같은 오류가 날것 입니다.

---------- javac ----------
test.java:10: possible loss of precision
found : int
required: short
short c = a + b;
^
1 error


int형이 아닌 long형으로 데이터를 다루기 위해선 숫자 끝에 소문자 l이나 대문자 L을 표시한다.

Int : 12 (10진수), 012 (8진수), 0x12 (16진수)

Long : 12L, 12l



2. 부동소수 자료형 (float ,double)

자바에서 제공하는 부동소수 자료형은 float와 double이 있습니다.
부동소수 자료형 뒤에 아무것도 붙이지 않거나 ‘d’ 또는 ‘D’ 가 붙으면 기본적으로 double 형이 되며 ‘f’, ‘F’를 붙이면 float 자료형이 됩니다.

유효 10진 자리수
float : 6자리, double : 15자리

2진수로 표현하므로 표현 오차 발생하며 보다 정확한 표현을 하려면 BigDecimal 이용하세요~

리터럴

float --> 1e1f, 2.F, .3f, 6.02E+23f, 1.4039846e-45f ~ 3.40282347e+38f
double --> 1e1, 2.D, .3, 6.02E+23d, 4.94065645841246544e-324 ~ 1.79769313486231570e+308



[예제]

// FloatPointTest.java

class FloatingPointTest
{
public static void main( String[] args )
{
System.out.println( 1.2345678901234567890123456789 ); // 1.2345678901234567
System.out.println( 2e3 ); // 2000.0
System.out.println( 0.1 + 1.6 ); // 1.7000000000000002
System.out.println( 3.0 / 0.0 ); // Infinity
System.out.println( 0.0 / 0.0 ); // NaN
}
}



3. 진리 자료형 (boolean)

boolean Literal : true, false

boolean 형은 다른 데이터형과 연산이 불가하며 boolean형은 boolean 형과 연산이 가능 합니다.

[예제]

public class BooleanTest {
public static void main(String[] args) {
boolean b1 = true; boolean b2 = !b1;
System.out.println("b1 : " + b1);
System.out.println("!b1 : " + b2);
System.out.println(b1 & b2);
System.out.println(b1 | b2);
System.out.println(b1 == b2);
System.out.println(" 6 < 7 : " + (6 < 7));
}
}

[결과]

b1 : true
!b1 : false
false
true
false
6 < 7 : true

4. 문자 자료형 (char)

자바는 유니코드를 지원하는데 JDK1.4부터는 Unicode 2.0까지 지원합니다.

한 문자를 표현할 때는 '와 ' 사이에 단 한 글자만이 올 수 있습니다.

자바에서 문자를 표현하는 방법은 두가지가 있는데 첫번째 방법은 있는 그대로 쓰는 것이며 두번째 방법은 유니코드로 표현하는 방법이다. 예)char c = ‘A’, char c = ‘\u0041’

[예]

class CharTest {
public static void main(String[] args) {
char c1 = 'A'; char c2 = '\u0041';
char c3 = '가'; char c4 = '\uac00';
System.out.println("c1:"+c1+",c2:"+c2);
System.out.println(c1 == c2);
System.out.println("c3:"+c3+",c4:"+c4);
System.out.println(c3 == c4);
}
}

[결과]

c1:A,c2:A
true
c3:가,c4:가
true

2013년 8월 10일 토요일

[오라클자바,오라클자바커뮤니티]Oracle Types of Data Integrity

Oracle Types of Data Integrity

A. Nulls
- 기본적으로 Column은 Null을 허용한다. 
Column에 대해서 null을 포함하는 row들의 insert나 또는 update를 허용하는 또는 허용하지 않는  하나의 column에 대해서 정 의되는 규칙.

B. Unique Column Values
-Column(또는 column들의 집합)에 대해서 unique value를 포함하는 row들의 insert나 또는  update만을 허용하는 column들(또는 column들의 집합)에 대해서 정
의되는 규칙, 즉 지정된 열또는 열들에서중복된 값을 허용안함

- Unique 제약조건을 구성하는 열중 일부분이 Null을 허용한다면 Null을 허용하지 않는 열은  동일한 값을 가질수 없다.

C. Primary Key Values
-Table에 있는 각 row는 column(또는 column들의 집합)에 있는 value들에 의해서 유일하게 식별될 수 있도록 하는 하나의 column(또는 column들의 집합)에 정의된
규칙.

- Primary Key Column은 Null을 허용하지 않는다.

- 만약 dept Table의 dept_no Column이 Primary Key라면 해당열에 대한 고유 인덱스를 암시적으로  생성하며 해당열에대해 not null제약조건을 암시적으로 생성한다.

- Primary Key Column은 16개 까지로 제한됨

D. Referential Integrity(참조 무결성)과 Foreign Key 무결성 제약조건
- 만약 Column 또는 column들의 집합에 대한 값(the dependent value)이 관련된 table의 column에 있는 값(the referenced value)과 match 된다면 하나의 row에
대한 insert 또는 update만을 허용하는 하나의 table에 존재하는 column(또는 column들의 집합)에 대해서 정의된 규칙.

-Referential integrity는 또한 어떤 data 조작의 유형이 참조되는 값들에 허용되는 지와 이러한 action들이 종속된 값들에 어떠한 영향을 주는 지를 지시하는 규칙들을 포함한다. 

Restrict
 참조되는 data의 update 또는 deletion을 허용하지 않는 referential
integrity.

Set to Null
 참조되는 data가 update되거나 delete될 때, 관련되는 모든 종속된 data는 NUll이 설정된다.

Set to Default
 참조되는 data가 update되거나 delete될 때, 관련되는 모든 종속된 data는 default value가 설정된다.

Cascade
 참조되는 data가 update될 때, 관련되는 모든 종속된 data도 update된다; 참조되는 row가 delete될 때, 관련되는 모든 종속된 row들도 delete된다.

F. Check Constrints
- 각 열또는 열집합에 대한 Check Constraints는 지정된 조건이 참인지 거짓인지 알수있게 한다.

- 사용자가 확인 조건을 지정함으로서 특수하거나 복잡한 무결성 조건을 시행한다.

- 문자열 리터럴이나 인수(투캐랙터, 투넘버, 투데이트)로 NLS 매개변수를 가지는 SQL을 포함한는  제약조건을 평가하기 위해 Oracle은 기본적으로 DataBase의 NLS설정값을 사용한다.

2013년 8월 6일 화요일

[ORACLEJAVA, 오라클자바교육강좌]struts DataBase 접근하기(DBCP)

DataBase 접근하기 


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

스트럿츠를 이용한 대부분의 개발은 데이터베이스에 대한 접근을 하게 됩니다. 가장 좋은 구성은 Action이 프리젠테이션 영역과 비즈니스 로직 영역을 연결하는 thin adapter 역할을 하도록 구성 하는 겁니다.

DAO approach인 경우 데이터에 대한 접근은 Business Interface의 뒤쪽에 숨어 있게 됩니다. 비즈니스 클래스에 대한 구현은 Connection Pool을 지원하는 DataSource를 통해 이루어 지므로 대부분의 데이터베이스에 대한 접근은 Connection Pool을 이용한다고 보면 됩니다.

Connection Pool이라는 것은 간단히 말해 DB에 연결을 맺은 Connection 객체를 미리 만들어 주어 사용자가 접속하면 할당을 하는 형태로 DB접속을 관리하는 것을 말합니다. 실제 테스트를 해보면 아시겠지만 데이터베이스에 대한 Connection을 수립하는데도 많은 비용이 드는 것은 사실이니까요… 생성과 삭제, 관리등을 Connection Pool에서 알아서 관리 해줍니다.

대부분의 컨테이너와 데이터베이스 시스템은 DataSource에 대한 구현을 번들로 제공 합니다. DataSource는 JNDI를 통해 접근이 가능하며 JNDI approach인 경우 별다른 고민 없이 DataSouce에 대한 비즈니스 클래스의 접근을 용이하게 해 줍니다.



-------------------------------
Struts DataSource Manager
-------------------------------

비즈니스 로직 계층에서는 데이터액세스에 대한 상세한 부분과 데이터베이스의 Conenction을 얻는  부분을 캡슐화 합니다. Struts에서는 DataSource Manager 라는 것이 있어 Action 클래스가 데이터 액세스 요구에 위해 리소스(DB Connection등)를 생산해 내는 것을 쉽게 만들어 줍니다.

가능하다면 데이터를 액세스 하는 경우 DAO(Data Access Object) 패턴을 사용하기를 권고 하며 그래서 Action 클래스는 내부의 메커니즘을 알 필요가 없게 되는 것입니다. 

DataSource Manager는 1.X 버전과의 호환을 위해 존재하며 향후 2.x 버전에서는 사라질 예정 입니다.

DataSource Manager는 struts-config.xml 파일에서 설정하며 javax.sql.DataSource 인터페이스를 구현한 어떠한 Conenction Pool에서도 deploy해서 사용 할 수 있습니다.

만약 현재 사용하고 있는 DB or 컨테이너가 javax.sql.DataSouce 인터페이스를 구현한 클래스를 제공 하다면 있는 것을 사용하셔도 무방 합니다.  대부분의 엔터프라이즈 애플리케이션 개발에서 보다 나은 성능을 위해 다른 connection pool을 사용하고 있죠^^

이 강좌에서는 Jakarta Commons dbcp's BasicDataSource(org.apache.commons.dbcp.BasicDataSource)를 이용하여 DataSource를 사용해 보도록 하겠습니다.

DBCP는 다음  URL에서 다운 받으시기 바랍니다.

http://jakarta.apache.org/commons/dbcp/downloads.html

1.        DBCP BasicDataSource를 사용하기 위한 설정은 아래와 같습니다…(struts-config.xml에 설정)

<!-- =============== for DataSource ======================= -->
<data-sources>
<!-- configuration for commons BasicDataSource -->
<data-source key="mysql" type="org.apache.commons.dbcp.BasicDataSource">
            <set-property property="driverClassName" value="com.mysql.jdbc.Driver" />
            <set-property property="url" value="jdbc:mysql://localhost/test" />
            <set-property property="username" value="root" />
            <set-property property="password" value="pw" />
            <set-property property="maxActive" value="10" />
            <set-property property="maxWait" value="5000" />
            <set-property property="defaultAutoCommit" value="true" />
            <set-property property="defaultReadOnly" value="false" />
            <set-property property="maxIdle" value="10000" />
        </data-source>
        <data-source key="oracle" type="org.apache.commons.dbcp.BasicDataSource">
            <set-property property="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
            <set-property property="username" value="scott" />
            <set-property property="password" value="tiger" />
            <set-property property="url" value="jdbc:oracle:thin:@localhost:1521:WINK" />
            <set-property property="maxActive" value="50" />
            <set-property property="maxIdle" value="10000" />
            <set-property property="maxWait" value="100" />
            <set-property property="defaultAutoCommit" value="true" />
</data-source>
</data-sources>

2. 소스 코드에서는 아래와 같이 사용 합니다.

public ActionForward
      execute(ActionMapping mapping,
              ActionForm form,
              HttpServletRequest request,
              HttpServletResponse response) throws Exception
{
 javax.sql.DataSource dataSource;
 java.sql.Connection myConnection;
 try {
  //for oracle
  javax.sql.DataSource dataSource = getDataSource(request,"oracle");
  myConnection = dataSource.getConnection();
 } catch (SQLException sqle) {
    getServlet().log("Connection.process", sqle);
 } finally {
    //enclose this in a finally block to make
    //sure the connection is closed
    try {
      myConnection.close();
    } catch (SQLException e) {
      getServlet().log("Connection.close", e);
    }
  }
}

3.        다중 데이터 소스를 사용하는 경우에는 struts-config.xml에서 다음과 같이 선언 합니다.

<data-sources>
  <data-source key="A" type="org.apache.commons.dbcp.BasicDataSource">
      ... properties as before ...
  </data-source>
  <data-source key="B" type="org.apache.commons.dbcp.BasicDataSource">
      ... properties as before ...
  </data-source>
  ...
</data-sources>


4.        다중 데이터 소스인 경우 프로그램에서는 다음과 같이 사용 합니다.

...
  try {
      dataSourceA = getDataSource(request, "A");
      dataSourceB = getDataSource(request, "B");
  ...

2013년 8월 4일 일요일

오라클 프로세스(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]조인 방법 변경(DRIVING_SITE), 오라클 힌트

조인 방법 변경(DRIVING_SITE)

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


분산환경(DB Link를 이용하는 경우)에서 쿼리를 사용하는 경우 일반적으로 SQL 실행의 주체는 해당 Query를 실행시킨 로컬데이터 베이스가 됩니다. 즉 원격지의 DEPT 테이블의 데이터를 로컬로 가져와서 조인을 하는 것은 로컬에서 하게 되구요… 참고로 이 힌트의 경우 Cost-Based Optimizer 또는 Rule-Based Optimizer환경 모두에서 사용 가능 합니다.

[형식]
/*+ DRIVING_SITE ( table ) */


SQL>select e.empno, e.ename, e.sal, d.dname, d.loc
      from emp e, dept@remote_db d   요기 DB Link 사용했습니다.
      where e.deptno = d.deptno;

Execution plan
-------------------------------------------------------------------
SELECT STATEMENT Optimizer=CHOOSE
NESTED LOOPS
  REMOTE          remote_db
  TABLE ACCESS (BY INDEX ROWID) of ‘EMP’
    INDEX (RANGE SCAN) OF ‘idx_emp_deptno’ (NON-UNIQUE)
 
SERIAL_FROM_REMOTE SELECT “DEPTNO”, “DNAME”, “LOC” FROM “DEPT” “D……

DRIVING_SITE 힌트를 사용하면 인자로 취한 테이블이 위치한 원격지에서 조인이 일어나게 할 수 있는데 즉 아래의 실행 계획을 보면 위에서와는 달리 SELECT STATEMENT 부분에 REMOTE라는 것이 보일 겁니다. 즉 다음의 쿼리는 원격지에서 주도해서 그곳에서 조인이 일어났음을 알 수 있습니다.


SQL>select /*+ driving_site(d) */ e.empno, e.ename, e.sal, d.dname, d.loc
      From emp e, dept@remote_db d
      Where e.deptno = d.deptno;

Execution plan
-------------------------------------------------------------------
SELECT STATEMENT(REMOTE) Optimizer=CHOOSE
MERGE JOIN
  SORT (JOIN)
      TABLE ACCESS (FULL) of ‘DEPT’
    SORT (JOIN)
      REMOTE*
 
SERIAL_FROM_REMOTE SELECT “EMPNO”, “ENAME”, “SAL” FROM ……

분산 환경의 쿼리를 실행하는 경우 그쪽의 DB사양이나 시스템 사양이 좋다면 DRIVING_SITE 힌트를 이용하여 그곳에서 드라이빙이 일어나게 할 수 있습니다.

[예]
SELECT /*+DRIVING_SITE(departments)*/ *
FROM employees, departments@rsite
WHERE employees.department_id = departments.department_id; 

[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 Database Startup shut down

---------------
 DataBase 시작
 ---------------
 Server Manager를 기동한후 작업실시 svrmgrl(unix), svrmgr30(NT용 Oracle 8.x)

 1. DataBase를 마운트 하지않고 인스턴스 시작
 startup nomount;
 - DataBase 생성주에만 이러한 경우가 발생
 2. DataBase를 마운트한후 인스턴트 시작
 startup mount;
 - 데이터 파일의 이름변경,리두로그 파일추가,삭제,변경
 Redo Log Archive Option 활성화또는 비활성화
 전체 DataBase 복구작업 등의 경우에 사용
 3. 인스턴스 시작후 DB를 Mount하여 Open
 startup open;
 - 사용자들이 일반적인 데이타 Access 작업을 할 수 있다.
 4. DataBase 시작단계에서 Access제한
 startup restrict;
 - 인덱스 재구축이나, DB Export/Import 수행
 SQL*Loader등의 작업 수행
 create session권한이 있는 사용자는 DB에 접속 가능하며, Create session/restriced sesison권한이
 있는 사용자는 DB에 Access 할 수 있슴. 즉 DBA만이 restricted session권한이 있어야 함
 5. Instance 강제시작
 startup force;
 - Instance 시작시 문제가 발생한 경우나, shutdown normal이나 shutdown immediate로 현재의 Instance를
 종료할수 없는 경우에 사용
 6. 인스턴스를 시작하고, DB를 Mount한다음 자동으로 복구
 startup recover;

 ---------------
 DataBase 종료
 ---------------
 1. 정상종료
 shutdown normal;
 - 사용자들이 모든 Session을 끊을때까지 기다린후 shutdown
 다시 시작할때 인스턴스 복구가 필요없슴.
 2. 즉시종료
 shutdown immediate;
 - 현재 Client의 모든 SQL명령이 즉시종료
 Commit안된 Session은 RollBack됨
 현재 session을 RollBack한후 즉시 Connection을 끊어버림
 3. 인스턴스중지
 shutdown abort;
 - DB를 즉시 종료할 경우에 사용
 인스턴스를 시작할때 문제가 발생한 경우
 Client의 SQL명령이 즉시 종료되며 Commit안된 Transaction은 RollBack안되며, 즉시 종료됨 
 

2013년 7월 28일 일요일

(오라클자바개발자실무교육,오엔제이프로그래밍실무교육센터)JAVA OOP OverL oading과 Overriding

슈퍼클래스로부터 메소드를 상속받을 때, 서브클래스 내에 같은 이름의 메소드가 있는 경우에  시그네췌(Segnature)가 다르면 중복(overloading)이 되고 시그네췌 (Segnature) 가 같으면 재정의(overriding)가 된다.  



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




오버라이딩
  상속관계에 있는 클래스들간에 같은 이름의 메소드를 정의하는 행위 
  기존 클래스의 메소드 구현 부분만 약간 변화시켜 새로운 클래스를 생성할 수 있다 
  매개변수의 개수와 타입이 같아야 한다. 

오버로딩
  같은 클래스 내에 같은 이름의 생성자나 메소드를 사용하는 행위 
  매개변수의 개수와 타입이 달라야 한다 


[오버라이딩 예제]

class A {
int i=10; 
int f() { return i; }
static char g() { return 'A'; }
}
class B extends A{
int i=20;            //AAC i°¡ °¡·AAo´A°IAI´U. 
int f() { return -i; }//AcA¤AC
static char g() { return 'B'; }
}
public class OverrideTest {
public static void main(String[] args) {
B b = new B();
System.out.println(b.i);  //20
System.out.println(b.f()); //-20
System.out.println(b.g()); //B
System.out.println(B.g()); //B

A a = b;  //A a = (B) bμμ °¡´E
System.out.println(a.i);  //10
System.out.println(a.f()); //-20
System.out.println(a.g()); //A
System.out.println(A.g()); //A
}
}


[오버로딩 예제]
class OverLoadingTest {
public void say() {
System.out.println("default...");
}

public void say(String msg) {
System.out.println(msg);
}

  public static void main(String args[]) {
    OverLoadingTest ol = new OverLoadingTest();
ol.say();
ol.say("안녕하세요~ 반갑습니다...");
}