레이블이 오라클 자바인 게시물을 표시합니다. 모든 게시물 표시
레이블이 오라클 자바인 게시물을 표시합니다. 모든 게시물 표시

2013년 10월 24일 목요일

ORACLE ROWNUM을 이용한 테스트 대량 데이터를 가진 테이블 만들기

ORACLE ROWNUM을 이용한 테스트 대량 데이터를 가진 테이블 만들기 

connect by 를 잘 이용하시면 됩니다.

CREATE TABLE emptest
    AS
      SELECT ROWNUM                    AS id
      ,      MOD(ROWNUM,100)            AS grp  --2000개씩 그룹핑
      ,      DBMS_RANDOM.STRING('u',5)  AS val  --랜덤 문자5개
      ,      DBMS_RANDOM.STRING('u',30) AS pad  --랜덤문자 30개
      FROM  dual
      CONNECT BY ROWNUM <= 2000000  --200만건 만들자... 

2013년 10월 23일 수요일

오라클 테이블 단편화(행이행, 행연쇄) 체크 (Oracle Table chain )

오라클 테이블 단편화(행이행, 행연쇄) 체크 (Oracle Table chain )



블록사이즈가 4K인데 레코드의 한행이 4K이상이라면 여러 블럭에 나누어 저장되게 되는데 이를
행연쇄 라고 하구요, 처음 insert문에서 입력되는 데이터는 작았는데 추후 많은 량의 데이터로 update
하게되어 해당 불록에 다 기록할 수 없어 다른 블록에 기록할 수 있는 데 이를 행이동 이라고 합니다.

행이행의 경우 원래의 블록에 새로운 블록을 가리키는 포인터를 두며 갱신전 데이터가 있는 영역은 사용하지 못하게 됩니다. 이 처럼 재이용되지 못하는 영역이 생기는 것을 단편화라고 하며 이를 확인하는 방법은 다음과 같습니다.

먼저 Analyze를 이용하여 통계 데이터를 추출 합니다.

SQL>analyze table emp compute statistics


행이행과 행연쇄가 있는지 조사 합니다. 아래에서 chain_cnt 값은 행이행이나 행연쇄로 인해
여러 블록으로 쪼개져 있는 행의 수를 의미합니다.

SQL> SELECT table_name, num_rows, blocks, empty_blocks, avg_space, chain_cnt
        FROM    dba_table
        WHERE chain_cnt > 0; 

2013년 10월 21일 월요일

자바 싱글톤, 쓰레드 예제 (Java Thread Singleton)

자바 싱글톤, 쓰레드 예제 (Java Thread Singleton)

public class Singleton {
    private static Singleton singleton = new Singleton();
    private Singleton() {
        System.out.println("Sington Class의 인스턴스 생성!");                   
    }
    public static Singleton getInstance() {       
        return singleton;
    }                                        
}
 
public class Main extends Thread {
    public static void main(String[] args) {
        System.out.println("Start.");       
        Singleton obj1 = Singleton.getInstance();
  Singleton obj2 = Singleton.getInstance();
        if (obj1 == obj2){
   System.out.println("obj1 == obj2");
        }
  else {
   System.out.println("obj1 != obj2");
  }
    }
}
 
=======================================
 
 
public class Singleton {
    private static Singleton singleton = null;
    private Singleton() {
        System.out.println("인스턴스 생성...");
        slowdown();                            
    }
    public static Singleton getInstance() {
        if (singleton == null) {
            singleton = new Singleton();
        }
        return singleton;
    }
    private void slowdown() {                  
        try {                                  
            Thread.sleep(10);                
        } catch (InterruptedException e) {     
        }                                      
    }                                          
}
 
 
public class Main extends Thread {
    public static void main(String[] args) {
        System.out.println("Start.");
        new Main("A").start();
        new Main("B").start();
        new Main("C").start();
        System.out.println("End.");
    }
    public void run() {
        Singleton obj = Singleton.getInstance();
        System.out.println(getName() + ": obj = " + obj);
    }
    public Main(String name) {
        super(name);
    }
}

2013년 10월 17일 목요일

오라클 동의어(Oracle Synonym) - 테이블, 뷰, 시쿼스에 대한 별칭

오라클 동의어(Oracle Synonym)
- 테이블, 뷰, 시쿼스에 대한 별칭, 동의어
- public, private로 생성 가능
- Public synonym은 생성할 수 있는 권한이 있는 user만이 만들 수 있으며, 모든 user들이 사용할 수 있다.

[문법]
CREATE [PUBLIC] SYNONYM
 synonym명 FOR object;
DROP [PUBLIC] SYNONYM synonym명; 
[예]
CREATE SYNONYM emp FOR scott.emp;
DROP SYNONYM emp;
 

SQL> conn system/onj
 
SQL> SELECT * FROM s_emp;
(* Error 발생)
 
SQL> SELECT * FROM scott.s_emp;
(* system user는 SELECT ANY TABLE 권한을 가지고 있으므로 성공)
 
SQL> CREATE SYNONYM s_emp FOR scott.s_emp;
 
SQL> SELECT * FROM s_emp;
 
SQL> CREATE TABLE s_emp (a number);
(* Error 발생)
 
Base table의 이름이 바뀌면 Synonym은 더 이상 사용할 수 없게 된다.

SQL> conn scott/tiger

SQL> RENAME s_emp TO e;

SQL> conn system/manager

SQL> SELECT * FROM s_emp;
(* 에러 발생)

SQL> conn scott/tiger

SQL> RENAME e TO s_emp;

2013년 10월 3일 목요일

[ORACLE강좌,오라클교육]오라클테이블 참조무결성, TABLE 참조 무결성(Referential Integrity)

[ORACLE강좌,오라클교육]오라클테이블 참조무결성, TABLE 참조 무결성(Referential Integrity)

데이터참조무결성(Referential Integrity) 에는 참조되는값(referenced value)이 delete 되거나 update 될 때 자식테이블의값(dependent value)을 어떻게 유지할 것인지에 따라 다음과 같은 rule의 종류가 있다.
 
 
Restrict
Referenced value에 대해 deleteupdate를 허락하지 않음(DML문장의 끝이나 Transaction의 끝에 check)
Set to Null
Referenced value에 대한 deleteupdate를 하면서 모든 dependent valueNULL로 설정함
Set to Default
Referenced value에 대한 deleteupdate를 하면서 모든 dependent valueDefault value로 설정함
Cascade
Referenced valueupdate 될 때 dependent value를 같은 값으로 설정하고, delete 될 때는 dependent row들을 함께 delete .
No Action
Referenced value에 대해 deleteupdate를 허락하지 않음
 
오라클자바커뮤니티에서 설립한 개발자교육6년차 오엔제이프로그래밍 실무교육센터
(오라클SQL,튜닝,힌트,자바프레임워크,안드로이드,아이폰,닷넷 실무개발강의)  



2013년 8월 9일 금요일

[오라클자바, 강좌, 교육, ORACLEJAVA, OnjProgramming]Oracle Number Data Type에 관해

========================
Number Data Type
========================

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



1. 고정숫자와 부동 소수점 숫자를 저장한다.

2. Oracle을 작동하는 서로 다른 시스템간에 38자 까지 정밀도를 유지하며 호환가능

3. 최대 38자리의 유효숫자를 가지는 양수/음수,0 등이 저장된다.

4. Column_name Number;Column_name Number(precision, scale)등의 형식으로 선언한다.
- Scale을 지정하지 않으면 0
- precision에 ‘*’를 표시하면 38
- 숫자필드를 지정할 때 정밀도와 Scale을 지정하는것이 좋음
- 7,456,123.89의 숫자가 있을 때 number로 선언하면 7456123.89로 저장
- 7,456,123.89의 숫자가 있을 때 number(*,1)로 선언하면 7456123.9로 저장
- 7,456,123.89의 숫자가 있을 때 number(9)로 선언하면 7456124로 저장
- 7,456,123.89의 숫자가 있을 때 number(9,2)로 선언하면 7456123.89로 저장
- 7,456,123.89의 숫자가 있을 때 number(6)로 선언하면 오류

5. Number형의 Column길이 계산방법
- Oracle은 numeric data를 가변 길이 포맷으로 저장한다. 각 값은 scientific notation으로
저장된다.(1 byte used to store exponent and up to 20 bytes to store mantissa) Oracle은
앞뒤의 0을 저장하지 않는다.
-  즉 1 Byte는 지수를 저장하며, 최대 20 Byte가 가수를 저장하는데 사용된다.(정밀도는 
  최대 38) 또한 선행하는 0이나,후행하는 0은 저장하지 않는다. 예를들면 숫자 412는
  4.12 * 10^2과 유사한 형식으로 저장된다.

  즉 1 Byte가 지수2를 저장하는데 사용되며, 2 Byte가 가수 (4,1,2)를 저장하는데 사용
  된다.

  이를 이용하여 Number(p)에 대한 Column의 Byte계산이 가능하다.
  1 Byte(지수) + floor(p/2) + 1 Byte(가수) + 1 Byte(음수)

6. 정수부분과 소수부분을 구분하는 소수점문자(.)를 변경할려면
  NLS_NUMERIC_CHARACTERS Parameter를 변경해야 한다.

7.특히 주의할 사항은 소수점 이하는 반올림되어 저장된다는 사실을 감안하여 수치 연산이 많은
경우 이를 고려하여 소숫점이하 크기를 결정하여야 한다.

8.오라클에서는 원래의 데이타를 다른 타입의 데이타로 바꾸기위해 아래와 같은 여러가지 함수를
제공한다. TO_NUMBER(), TO_CHAR(), TO_DATE(), HEXTORAW(), RAWTOHEX(),
  ROWIDTOCHAR(), CHARTOROWID()을 이용하여 명시적으로 데이타 타입을 변경을 할 수 있을 뿐
아니라 값 지정(assignment)시 오라클은 자동적으로 변환 작업을 수행하고, 문장(expression)
내에서도 자동적으로 연산을 수행하기 위해 타입 변환을 수행한다. 

9.숫자 타입과 문자 타입의 값과 비교되면 상대 타입을 숫자 타입으로 바꾸어 비교된다.
예를 들어 NUM1이 NUMBER 타입이고 인덱스가 생성되어 있을때 아래의 쿼리문을 수행하게 되면
    SELECT * FROM TABLE1 WHERE NUM1 = '123';  일 경우
내부적으로 위의 문장은 문자 타입의 변환이 발생함으로 위의 문장은 아래와 같이 변동되어 처리
된다.
  SELECT  * FROM TABLE1 WHERE NUM1 = TO_NUMBER('123');
  로 변동 되어 처리 되므로 인덱스를 사용하게 된다.

10.NUMBER 타입으로 지정된 컬럼을 LIKE 'char%'로 비교하면 인덱스를 사용하지 않으므로 주의
하여야 한다.

    SELECT * FROM TABLE1 WHERE NUM1 LIKE '1%';
 
  을 수행하게 되면 일단 숫자 타입을 기준으로 '1%'을 바꾸려고 하지만 LIKE문으로 인해 숫자
타입으로 변경할 수 가없다. 따라서 NUM1이 문자 타입으로 변경된다.
  즉, 내부적으로

    SELECT * FROM TABLE1 WHERE TO_CHAR(NUM1) LIKE '1%';

  로 변형이 일어나 수행하게 되므로서 수행 속도 향상에 주요한 인자가 되는 인덱스를 사용할
수 없게 된다. 따라서 가능한한 인덱스를 생성할 컬럼은 문자 타입이 효과적이다.

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 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();
}
}