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%';

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

댓글 없음:

댓글 쓰기